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

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这样调用

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥500 求华为P30PRO手机硬盘数据恢复
  • ¥15 关于#vscode#的问题:ESP32开发板对接MQTT实现小灯泡的开关
  • ¥15 TMC2209串口模式下读取不到寄存器的值串口助手蓝色字体是发过去的消息,绿色字体是收到的消息,第二行发送读取寄存器的指令但是没有读取到寄存器的值串口助手如下图:接线如下图,如何解决?
  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题