gpt4 book ai didi

c++ - 包括同一类的不同版本

转载 作者:行者123 更新时间:2023-11-30 03:43:01 25 4
gpt4 key购买 nike

我今天下午的大部分时间都在追查一个错误,该错误基本上归结为在 Visual Studio 2015 中包含声明相同类的同一头文件的两个不同版本。大大简化后,它如下所示;

老相机.h

#pragma once

class camera
{
public:
camera();
int a;
double x,y,z;
};

相机.h

#pragma once

class camera
{
public:
camera();
double x,y,z;
};

相机.cpp

#include camera.h

camera::camera()
{
x = y = 0;
z = 1;
};

mytransclass.h

#pragma once

#include "oldcamera.h"

class trans
{
public:
camera m_camera;
};

func.cpp

#include "mytransclass.h"

void MyFunc(trans *ptrans)
{
ptrans->x = 1.0;
ptrans->y = 2.0;
ptrans->z = 3.0;
}

该项目包括 camera.cpp 和 func.cpp,当单步执行 MyFunc 时,调试器显示分配实际上没有做任何事情。问题是这是否应该在没有警告的情况下编译和链接,如果它是合法的(很可能知道 c++ 的复杂继承),为什么赋值失败?如果合法,有没有办法将其标记为错误?编译器是 Visual C++ 2015。

最佳答案

当您#include 时,您基本上是将该文件复制并粘贴到您#include 的位置。拥有多个相同的类定义实际上并不是错误,只要它们不是包含在同一编译单元 (cpp) 中的多个相同的类定义。如果你这样做,它会破坏单一定义规则。

在您的设置中,oldcamera.h 中 Camera 版本中的函数正在调用为 camera.h 编写的函数(因为这些函数是唯一经过编译的函数,因为您说 oldcamera.cpp 不在项目中).然而,这些函数依赖于类 Camera 的数据布局是某种方式。由于 oldcamera.hCamera 和新的 camera.hCamera 具有不同的数据布局(你没有演示,但我假设),狗屎击中了粉丝。

关于c++ - 包括同一类的不同版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36411023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com