如何通过编译错误找到C++拷贝构造函数的用途?

mar*_*ark 5 c++ oop copy-constructor visual-studio-2010

简而言之:是否有某种方法可以修改类定义,使得无论在何处使用它都无法在使用复制构造函数时进行编译?

我有一个非常大的项目,正在清理一些类定义.有一个类我明确地不想使用复制构造函数(让我们忽略为什么这是为了讨论),为了安全起见,我想我只是将复制构造函数定义为私有而不是实际上实现它...这样,如果我试图在任何地方使用它会抛出编译错误.瞧,它编译得很好,但我有一个链接器错误...找不到复制构造函数实现!据推测,这意味着它在某个地方使用,但我无法找到它在哪里使用.顺便说一下,这是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
Run Code Online (Sandbox Code Playgroud)

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

Kil*_*nDS 9

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

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

在C++ 11之前,这通常是通过从声明私有拷贝构造函数的类继承来完成的,例如boost :: NonCopyAble(你可以简单地复制这个类,它只有几行).在这种情况下,您的类(或任何朋友或孩子)也无法访问复制构造函数,它将生成编译时错误.

  • @mark:我的答案的第二部分提供了另一种选择,因为我知道许多人不能使用C++ 11;).这实际上与Michael Burr的答案相同. (2认同)

Mic*_*urr 5

从不可复制的类继承:

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


class Sample : private noncopyable {
private:
    // not implemented

    Sample( const Sample& rhs );
    Sample& operator=( const Sample& rhs );
public:
    // implemented
    Sample();

    // ...
};

Sample *samp1 = new Sample;
Sample *samp2 = new Sample( *samp1 ); // <<-- compile-time error
Run Code Online (Sandbox Code Playgroud)

即使您没有C++ 11(delete其他地方提到的方法可能更可取),这也可以正常工作.