C++ G++ 编译器 - 错误:隐式声明的定义

c++ g++ compiler - error: definition of implicitly-declared

本文关键字:声明 定义 G++ 编译器 错误 C++      更新时间:2023-10-16

我搜索了教科书和网络。我似乎找不到任何东西来解释底部的错误。它们来自复制构造器和运算符 = 重载。

1 #ifndef SURVEYDATA_H
2 #define SURVEYDATA_H
3
4 class SurveyData
5 {
6     public:
7         int   getSector();
8         int   getExposure();
9         int   getSpeed();
10
11         SurveyData();
12         SurveyData(int, int, int);
13         SurveyData(const SurveyData&);
14
15         SurveyData& operator=(const SurveyData&);
16     private:
17         int sector;
18         int exposure;
19         int speed;
20 };
21 #endif

头文件 ^

SurveyData::SurveyData(const SurveyData& s)
18 {
19     sector = s.getSector();
20     exposure = s.getExposure();
21     speed = s.getSpeed();
22 }
23
24 SurveyData& SurveyData::operator=(const SurveyData& s)
25 {
26     sector = s.getSector();
27     exposure = s.getExposure();
28     speed = s.getSpeed();
29     return *this;
30 }

.cpp文件错误部分来自^

surveydata.cpp:17:43: error: definition of implicitly-declared ‘constexpr SurveyData::SurveyData(const SurveyData&)’
SurveyData::SurveyData(const SurveyData& s)
^
surveydata.cpp:24:54: error: definition of implicitly-declared ‘constexpr SurveyData& SurveyData::operator=(const SurveyData&)’
SurveyData& SurveyData::operator=(const SurveyData& s)

错误^ 任何帮助理解这一点,不胜感激。

H.Crisnan在评论中所说的话。 使这些get函数恒定。 对于课堂之外的任何地方来说,通过常量引用传递SurveyData都是有意义的,这可能是一件好事。 所以继续这样做。

然而。。。。

实际上,类中不需要复制构造函数或重载赋值运算符。由于您的类没有任何无法用浅拷贝提供服务的已分配指针或成员,因此编译器生成的默认复制构造函数和默认赋值运算符将做得很好。 因此,稍后当您向 SurveyData 添加新变量时,您不会引入错误,因为您忘记更新复制构造函数。

当需要显式分配成员(例如.raw指针(以使赋值有效时,实现复制构造函数和赋值运算符。您可能还需要一个析构函数:排除三个。 或者相反,如果您的类足够简单,不需要析构函数,则可能也不需要显式定义复制构造函数或赋值运算符。

就把这些拿出来吧。

class SurveyData
{
public:
int   getSector() const;
int   getExposure() const;
int   getSpeed() const;

SurveyData();
SurveyData(int, int, int);

private:
int sector;
int exposure;
int speed;
};

但是,如果您确实需要复制构造函数或赋值运算符,则这些方法可以访问私有数据。 所以你总是可以说:

SurveyData& SurveyData::operator=(const SurveyData& s)
{
sector = s.sector;
exposure = s.exposure;
speed = s.speed;
return *this;
}