学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
Learning C++ and got an error with an early example (constructor required before non-static data member)
本书后面:C++入门斯坦利B利普曼,乔西拉乔伊,芭芭拉穆第5版
第 1.5 节包含此代码来演示对类型为Sales_item的对象进行的标准操作(>istream和<
#include <iostream>
#include "Sales_item.h"
int main(){
Sales_item book;
cin>> book;
cout<< book << endl;
return 0;
}
文件Sales_item.h可从书中给出的下载链接获得。
我正在使用以下CMake来编译我的源ISBN0.cpp:
cmake_minimum_required(VERSION 3.0)
add_executable(readISBN ISBN0.cpp)
编译时出现以下错误Sales_item2.h:11:7: error: constructor required before non-static data member for ‘Sales_item::units_sold’ has been parsed
我试图将原始Sales_item.h削减为以下内容以重现错误:
#ifndef SALESITEM_H
#define SALESITEM_H
#include <iostream>
#include <string>
class Sales_item {
friend std::ostream& operator<<(std::ostream&, const Sales_item&);
friend std::istream& operator>>(std::istream&, Sales_item&);
// private members as before
private:
std::string bookNo; // implicitly initialized to the empty string
unsigned units_sold = 0; // explicitly initialized
double revenue = 0.0;
public:
// constructors are explained in section 7.1.4, pages 262 - 265
// default constructor needed to initialize members of built-in type
Sales_item() = default;
Sales_item(const std::string &book): bookNo(book) { }
Sales_item(std::istream &is) { is >> *this; }
public:
// operations on Sales_item objects
// member binary operator: left-hand operand bound to implicit this pointer
Sales_item& operator+=(const Sales_item&);
// operations on Sales_item objects
std::string isbn() const { return bookNo; }
double avg_price() const;
};
std::ostream&
operator<<(std::ostream& out, const Sales_item& s)
{ ... }
std::istream&
operator>>(std::istream& in, Sales_item& s)
{ ... }
有人可以解释1:错误试图告诉什么吗?(简单来说(&2:需要什么修改才能使示例工作?
看到初学者的例子不起作用真是令人沮丧!
C++从 C++ 11 开始支持类内非静态成员的初始化。在此之前,非静态成员无法在类定义中初始化(该示例在此处尝试执行的操作(。G++ 版本 5.4 支持此功能。可能你只需要像这样使用 c++ 标志进行编译(使用 g++ 编译器用于 c++,而不是用于 c 语言的 gcc(:
$ g++ -std=c++11 your_file.cpp -o your_program
类的非静态成员特定于该类,并且类的每个对象都获得这些成员的单独实例。 有关非静态成员的更多信息,请查看以下链接: CPP 参考 和 这个适合初学者的优秀 C++ 网站
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 不带初始值设定项的 constexpr 静态数据成员