C++错误:类函数的多个定义
C++ Error: Multiple definitions of class functions
我在.h文件中有一个C++类,如下所示:
#ifndef __GLWidget_h__
#define __GLWidget_h__
class PivotShape
{
// This is allowed
void do_something() { std::cout << "Doing somethingn"; }
// This is not allowed
void do_something_else();
}
// This is not allowed
void PivotShape::do_something_else()
{
std::cout << "Doing something elsen";
}
#endif
如果我在类声明中添加方法,一切似乎都很好。但是,如果我在类声明之外添加方法,我会得到这样的错误:
/usr/share/qt4/bin/moc GLWidget.h > GLWidget_moc.cpp
/programs/gcc-4.6.3/installation/bin/g++ -W -Wall -g -c -I./ -I/usr/include/qt4 GLWidget_moc.cpp
/programs/gcc-4.6.3/installation/bin/g++ main.o GLState.o GLWidget.o MainWindow_moc.o GLWidget_moc.o -L/usr/lib/x86_64-linux-gnu -lQtGui -lQtOpenGL -lQtCore -lGLU -lGL -lm -ldl -o main
GLWidget.o: In function `std::iterator_traits<float const*>::iterator_category std::__iterator_category<float const*>(float const* const&)':
/home/<user>/<dir>/<dir>/<dir>/<dir>/<dir>/GLWidget.h:141: multiple definition of `PivotShape::do_someting_else()'
main.o:/home/<user>/<dir>/<dir>/<dir>/<dir>/<dir>/GLWidget.h:141: first defined here
我认为重复是由Make文件中的这个片段引起的。我认为.h文件正在被转换为_moc.cpp文件,这允许多个包含:
# Define linker
LINKER = /programs/gcc-4.6.3/installation/bin/g++
MOCSRCS = $(QTHEADERS:.h=_moc.cpp)
# Define all object files to be the same as CPPSRCS but with all the .cpp
# suffixes replaced with .o
OBJ = $(CPPSRCS:.cpp=.o) $(MOCSRCS:.cpp=.o)
这是问题所在吗?如果是,我该如何修复?如果没有,怎么回事?
我认为在C++中,在类声明的主体中包含类方法是非法的。如果这是合法的,那么这似乎是解决问题的简单方法。这合法吗?
编辑:
我忘了提一下,我已经发现将方法声明为inline
是可行的,但我想知道如何避免重复。
您正在打破一个定义规则;在头中定义函数意味着在包括头的每个翻译单元中都有一个定义,并且在程序中通常只允许有一个单独的定义。
选项:
- 将函数定义移动到源文件中,因此只有一个定义;或
- 将
inline
添加到函数定义中,以放宽规则并允许多个定义;或 - 在类中定义函数,使其隐式内联。(为了回答你的最后一个问题,是的,这是合法的。)
此外,不要使用像__GLWidget_h__
这样的保留名称。
在源文件中定义函数,或使用inline
在类定义之外的头文件中定义它。
请注意,您仍然可以在类定义中定义它,而不使用inline
关键字。
相关:成员函数定义
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 通过函数指针定义类范围之外的方法
- 使用子类覆盖基类中定义的函数
- 当类成员参数具有相同的名称时,如何定义构造函数?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 定义类模板构造函数的两种方法之间的区别
- 如何从 cpp 中的函数返回自定义类对象?
- 构造函数中定义的类函数的默认参数
- 将成员函数的返回类型引用到C++中的自定义类
- 使用自定义比较函数在类内进行列表排序
- Qt基类函数定义
- 类中未定义的函数
- C++:如何在结构中定义类实例.类具有参数化的构造函数
- 没有定义的类函数如何不会导致错误
- 标准在哪里指定类中定义的函数是内联的?
- 自定义类对象的C++向量 - 复制构造函数已删除 - std::ifstream
- 复制构造函数C++中自定义类的动态数组
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 重新定义类函数错误C++
- C++:定义类函数的.cpp文件中实例本身的表示关键字