韩唐伯石 2022-02-05 15:31 采纳率: 57.9%
浏览 307
已结题

vs 中写c++怎么让多个文件不互相影响?

因为是新手学习,所以项目里都是写不相关的东西,但这些文件会互相影响。
最头疼的就是经常出现异常直接就终止了。
因为我写新文件中的类名经常是一摸一样的,有时候新文件的类会调用其他文件里的类进而导致各种异常,这到底怎么解决呢?
还有就是每个文件里几乎都有main方法,到底怎么解决呢?我现在只能在之前的文件的main函数上加数字,但好像这种方法也会产生各种异常……

例如:我运行第一个文件,运行的时候会执行第二个文件的类,刚把第二个文件屏蔽生成,第三个文件的类又被第一个文件执行时调用了,绝望啊,这往后还有一大堆文件呢……

#include<iostream>
#include<string>
using namespace std;

class A
{
public:
    int first;
};

class B :virtual public A
    //vitual关键字变为虚继承
    //A是B的虚父类
{};

class C :virtual public A
{};

class D :public B,public C
{};

void test5()
{
    D d;
    d.B::first;
    //d继承了两个first,需要明确是哪一个
    //注意d是真的继承了两个int first
    cout << sizeof(C) << endl;    //4
    cout << sizeof(D) << endl; //8

    //但有些属性只需要继承一个,为了避免浪费空间,所以需要虚继承
    d.B::first = 10;
    d.C::first = 20;
    d.first = 30;
    cout << d.C::first << endl;
    cout << d.B::first << endl;
    cout << d.first << endl;
    //使用虚继承后所有的属性共用一个first,类似于static
    //且不再需要加作用域
    //虚继承原理为虚父类指针,直接指向虚积累表,虚积累中的偏移量指向唯一的数据
    //B类和C类:vbptr -> vbtable -> first,最终都指向first
    //而D类继承的其实是vbptr
}

int main()
{
    test5();

    system("pause");
    return 0;
}

第二个文件:

#include<iostream>
#include<string>
using namespace std;

class A
{
public:
    A()
    {
        first = 100;
    }
    int first;
};

class B 
{
public:
    B()
    {
        second = 999;
    }
    int second;
};

class C :public A, public B
{
public:
    C()
    {
        third = 333;
        forth = 666;
    }
    int third;
    int forth;
};

void test4()
{
    C c;
    cout << "sizeof(c)" << sizeof(c) << endl;
    //16 一个A的int 一个B的int 两个自己的int
    //同名属性、函数要加作用域
}

int main6()
{
    test4();

    system("pause");
    return 0;
}

第三个文件:

#include<iostream>
#include<string>
using namespace std;

class A
{
public:
    A()
    {
        cout << "A构造" << endl;
    }

    ~A()
    {
        cout << "A析构" << endl;
    }
};

class B : public A
{
public:
    B()
    {
        cout << "B构造" << endl;
    }

    ~B()
    {
        cout << "B析构" << endl;
    }
};

class C : public B
    //继承Base类
{
public:
    C()
    {
        cout << "C构造" << endl;
    }

    ~C()
    {
        cout << "C析构" << endl;
    }
};

void test1()
{
    C c;
}

int main3()
{
    test1();
    //ABCCBA
    //先进栈后出栈
    system("pause");
    return 0;
}

  • 写回答

13条回答 默认 最新

  • TX-01 2022-02-05 18:52
    关注

    个人建议还是起复杂的类名,如果非要起一样的那你可以引入命名空间namespace关键字,把类放在这里面,调用的时候类似调用标准库std::vector这样调用

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 起个昵称难得很 2022-02-05 17:38
    关注

    在VS左侧点击解决方案资源管理器,在不需要运行的文件上右键-【属性】,选择【从生成中排除】,则可不移除文件实现运行另一个文件。

    评论
  • LYSnowy 2022-02-05 15:51
    关注

    就算是新手,我的建议也是好好起名字,不相关的代码分开放

    如果你的代码没有用,你就删除,如果有用,你这种起名方式后面再看自己会很难受,好好起名字,名字就是功能,这样最方便

    评论
  • Code_流苏 C/C++领域优质创作者 2022-02-05 15:55
    关注

    vs 中写c++怎么让多个文件不互相影响?
    比较麻烦的方法:
    开多个项目,去写
    比较简便的方法:
    1.一个项目里只允许一个main 函数作为程序运行入口。解决方法:注释掉其他不运行文件中的main函数

    另外一个需要注意的是不同的cpp文件中不能有相同的要调用的函数名,否则程序也会不知道要调用哪个函数,最好取不同的函数名或者注释掉其他文件中的相同函数的名字。

    2.换一个简便的编译器——devc++(下载地址:https://bloodshed-dev-c.en.softonic.com/)

    以上仅供参考,如有任何疑问,可以评论回复,看到即回。
    希望对题主有所帮助!可以的话,点个采纳!

    评论 编辑记录
  • 急速光粒 2022-02-06 07:41
    关注

    很简单啊,你建一个项目,每次编译只选一个文件到工程,测试下一个就把当前文件移出选入下一个就可以很简单测试了。

    评论
  • 旺仔不爱牛奶 2022-02-05 15:41
    关注

    首先,建议采用好的类命名方法,避免重复命名。再有,理论上不会自动调用其他cpp文件的。另外,每个项目有且仅有一个main()函数作为程序运行的起点,在main后面加数字编号将使其不再成为程序入口。

    评论
  • prince_zxill 2022-02-05 18:07
    关注

    建议你把类的名字起的详细而简介,避免重复

    评论
  • 归期. 2022-02-06 05:26
    关注

    用VS xode呢 vs code 基本上都能避免你的这些问题了 但类命名还是调一些独特油简易的比较好

    评论
  • janrick 2022-02-06 11:08
    关注

    用vs code创建项目,然后不同的的文件引入命名空间,只保留一个main方法的文件,需要跑某个文件时,用命名空间加类名引入进来,不相关的文件就不要引入

    评论
  • [PE]经典八炮 2022-02-06 13:05
    关注

    你可以把不用的代码注释掉,然后再编译。还有,标识符起名字别偷懒,ABCD,这谁能看懂啊,初学者也要好好起名。或者你可以把那些类放到不同命名空间中。

    评论
  • Brainer-Gao 2022-02-06 15:28
    关注

    论命名和分层的重要性!

    评论
  • liu_zhоu 2022-02-05 15:45
    关注

    新手学习推荐简单一点的devc++(或者衍生的redpandadevc++)
    类名重复的话可以使用名字空间namespace(可以看看这个: https://blog.csdn.net/weixin_48561269/article/details/112450214?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
    最好的还是分成多个项目或者单文件编译(好习惯

    评论 编辑记录
  • 小大飞 2022-02-07 17:31
    关注

    建议,把不用的类注释掉,因为的你的多个文件,都放在一个项目中,又没有区分命名空间,他们相当于在同一个默认的命名空间中,然后默认命名空间,有多个名字相同的类,它们之间就会冲突。
    命名空间正是解决类名相同的问题的,至于main方法冲突问题,C#一个项目只允许有一个main方法(现在好像允许多个了,但是调试时还是要指定唯一入口);java允许一个类有一个main方法,方便测试;C++我不写c++不知道,大概也是一个项目只允许一个main方法,作为唯一入口吧。 既然建议您注释代码了。你就把不用文件的main方法注释掉好了。

    评论 编辑记录
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 2月14日
  • 已采纳回答 2月6日
  • 赞助了问题酬金5元 2月5日
  • 创建了问题 2月5日

悬赏问题

  • ¥15 我不明白为什么c#微软的官方api浏览器为什么不支持函数说明的检索,有支持检索函数说明的工具吗?
  • ¥15 ORBSLAM2框架跑ICL-NUIM数据集
  • ¥15 在我想检测ros是否成功安装时输入roscore出现以下
  • ¥30 老板让我做一个公司的投屏,实时显示日期,时间,安全生产的持续天数,完全没头绪啊
  • ¥15 Google Chrome 所有页面崩溃,三种解决方案都没有解决,我崩溃了
  • ¥20 使用uni-app发起网络请求,获取重定向302返回的cookie
  • ¥20 手机外部浏览器拉起微信小程序支付 (相关搜索:微信小程序)
  • ¥20 怎样通过一个网址找到其他同样模版的网址
  • ¥30 XIAO esp32c3 读取FDC2214的数据
  • ¥15 在工控机(Ubuntu系统)上外接USB蓝牙硬件进行蓝牙通信