c++ - 如何通过编译错误找到 C++ 复制构造函数的使用位置?

标签 c++ visual-studio-2010 oop copy-constructor

简而言之:有没有什么方法可以修改类定义,使其在复制构造函数的使用点处无法编译,无论它在何处使用?

我有一个非常大的项目,正在清理一些类定义。有一个类我明确不想使用复制构造函数(让我们忽略为什么这是为了讨论),为了安全起见,我想我只是将复制构造函数定义为私有(private)而不是实际上实现它......如果我试图在任何地方使用它,它会抛出一个编译错误。瞧,它编译得很好,但我有一个链接器错误......找不到复制构造函数实现!大概这意味着它在某处使用,但我无法找到它的使用位置。顺便说一句,这是 Visual Studio 2010。所以我的问题是,有没有什么方法可以修改类定义,使其在使用时无法编译?

class Sample {
private:
    // not implemented
    Sample( const Sample& rhs );
    Sample& operator=( const Sample& rhs );
public:
    // implemented
    Sample();
...
};

Sample *samp1 = new Sample;
Sample *samp2 = new Sample( *samp1 ); // <<-- inaccessible here!  this works

大概因为我没有遇到编译错误,但遇到了链接器错误,这意味着类本身(或 friend )正在执行复制构造的创建(因为这就是可以访问私有(private)构造函数),但我肯定找不到它!

最佳答案

在 C++11 中,您可以将定义更改为

class Sample {
private:
    // not implemented
    Sample( const Sample& rhs ) = delete;
    Sample& operator=( const Sample& rhs ) = delete;
public:
    // implemented
    Sample();
...
};

在 C++11 之前,这通常是通过继承一个声明私有(private)复制构造函数的类来完成的,例如 boost::NonCopyAble (你可以简单地复制这个类,它只有几行)。在这种情况下,您的类(class)(或任何 friend 或 child )也无法访问复制构造函数,并且会产生编译时错误。

关于c++ - 如何通过编译错误找到 C++ 复制构造函数的使用位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037330/

相关文章:

c# - 如何让 Visual Studio CTRL-K-D 不展开 getter 和 setter

php - 构建可伸缩(可扩展)、可维护和松耦合软件的最佳技术是什么?

java - 多线程 Android 应用程序中的组件应该如何交互?

javascript - 如何停止间隔?

c++ - std::system 即使在父进程退出后也会执行吗?

C++:使用sqlite创建动态数据库以传输语音流

c++为什么不在指数时打印所有元素

c++ - 如何真正删除 vector

visual-studio-2010 - 为什么 VS 2010 ATL 简单对象向导不会在项目名称包含连字符时生成 .cpp/.h 文件?

VS2010中的Python