【发布时间】:2012-10-31 11:47:03
【问题描述】:
我知道它已经出现了无数次,但这次是自动生成的代码:
class testGetter{
testGetter * ptr; // wrote this
public:
// this is autogenerated by eclipse
const testGetter*& getPtr() const {
return ptr;
}
void setPtr(const testGetter*& ptr) {
this->ptr = ptr;
}
};
我在 Windows 7 mingw - g++ 版本 4.7.0
那么它是 Eclipse (juno) 模板中的一个错误吗?
编辑:编译器调用:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fpermissive -o Visitor.o "..\\Visitor.cpp"
EDIT 2013.06.12:我应该在收到反馈后添加I reported the thing
【问题讨论】:
-
到底有什么问题?它使用什么数据来自动生成这样的代码?
-
问题是 getter 的“const”放错了位置。在编写时,它返回对指向常量 testGetter 的指针的引用。它应该是
testGetter * const & getPtr()- 对指向 testGetter 的常量指针的引用。 -
我从不后悔将我的编码风格改为
T const &而不是const T &。这样,您可以从右到左读取类型(对 const T 的引用),并且您可以毫无问题地看到T const *(指向 const T 的指针)、T * const(指向(可变)T 的 const 指针)之间的区别) 和T const * const(指向 const T 的 const 指针)。 -
@Mr_and_Mrs_D:Eclipse 生成的代码不正确。我提供了一个答案,解释了为什么该语言不允许使用该代码。 C++ 是一种相当复杂的语言,我一般不会相信代码生成。它适用于简单的情况,但当事情变得复杂时,很难把它做好。使用代码生成加一点盐,理解它可以减轻打字的负担,但在某些情况下,您需要修复输出。还要考虑 getter 通常不是一个好主意,而指针则更少。考虑在语义上返回指针是否有意义。
-
@Mr_and_Mrs_D:还要注意问题不仅在于特定工具,还在于自动化过程。你班上的吸气剂应该做什么?指向对象的值是状态的一部分吗?在这种情况下,您需要返回一个
testGetter const * const &,但在某些情况下它不是 (std::shared_ptr),您想直接返回一个普通的testGetter *。做出决定时要考虑程序的设计,Eclipse(或任何其他工具)不可能知道您的设计需要什么。