2013-03-07 53 views
-2

我问过一个类似的问题,但现在我想更具体。 我所面临的问题是,我有一个包含非可复制对象,当有人想用我的接口和他没有利用好(没有尝试使用对象的拷贝构造函数),他将得到一个编译错误将一个对象指向对象而不是他的实际代码。 所以两个问题:1。 我可以修复它以某种方式把它指向他原来的代码行? 2.如果我不能,我怎样才能把一个static_assert,如果有人竟试图使用复制c'tor只会发生(我已经尝试了一些,但后来我让他们即使有人不使用它.. )编制包含非可复制对象的对象警示不可读

我添加了一个示例代码和编译错误,以防我不明白... 注意最后编译错误指向ObjectHolder h。文件..而我希望它指向主 谢谢!

*当我替换名称时出现错误..它实际上是创建编译错误的代码。 和假设我不想实现私有副本c'tor只是转发残疾复制

class NonCopyableObject 
{ 
    public: 
     virtual ~NonCopyableObject() {} 

     NonCopyableObject(int i) { m_index = i;} 
     int m_index; 
    private: 
     NonCopyableObject(const NonCopyableObject& other) {} 
}; 

class ObjectHolder 
{ 
    public: 
     virtual ~ObjectHolder(); 
     ObjectHolder(int i) : obj(i) {} 

     NonCopyableObject obj; 
}; 

void main() 
{ 
    ObjectHolder first(1); 
    ObjectHolder second(first); 
} 

1>------ Build started: Project: tester, Configuration: Debug Win32 ------ 
1> main.cpp 
1>d:\users\someone\documents\visual studio 2012\projects\tester\tester\objectholder.h(13): error C2248: 'NonCopyableObject::NonCopyableObject' : cannot access private member declared in class 'NonCopyableObject' 
1>   d:\users\someone\documents\visual studio 2012\projects\tester\tester\noncopyableobject.h(15) : see declaration of 'NonCopyableObject::NonCopyableObject' 
1>   d:\users\someone\documents\visual studio 2012\projects\tester\tester\noncopyableobject.h(8) : see declaration of 'NonCopyableObject' 
1>   This diagnostic occurred in the compiler generated function 'ObjectHolder::ObjectHolder(const ObjectHolder &)' 
+1

尝试隐藏的ObjectHolder拷贝构造函数太 – 2013-03-07 15:49:07

+4

我敢肯定,这是不是导致在这里张贴的编译错误的实际代码。 – Nawaz 2013-03-07 15:49:48

+0

如果你不想让你的对象可访问的拷贝构造函数,使它'private'(或者,在C++ 11,'delete'它)。 – 2013-03-07 15:55:21

回答

1

提供不反映提供的代码中的错误消息。

这且不说你有一个错误。考虑到代码:

class ObjectHolder 
{ 
    public: 
     virtual ~ObjectHolder(); 
     ObjectHolder(int i) : obj(i) {} 

     ObjectHolder obj; 
}; 

编译器是怎么想以确定所需内存为ObjectHolder当它是递归的金额是多少?

+0

当我复制它时是一个错误!!它实际上是 class ObjectHolder { public: virtual〜ObjectHolder(); 的ObjectHolder(int i)以:OBJ(I){} NonCopyableObject OBJ; }; – Alon 2013-03-07 21:35:51