C++ Dev Note -2 - 关于类

本文详细解析了C++中Item_base、Disc_item及Bulk_item三个类的构造过程,重点介绍了构造函数成员初始化列表的使用方法及其注意事项,并阐述了继承机制下构造函数的调用顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Item_base {
public:
  Item_base(const std::string &book = "", double sales_price = 0.0): isbn(book),price(sales_price)  {}

  std:string book() const { return isbn; }

  virtual double net_price(std::size_t n) const { return n*price; };

  virtual ~Item_base();
protected:
  double price;
private:
  std::string isbn;

}

 

class Disc_item : public Item_base {

public:

  Disc_item(const std::string& book="",double sales_price=0.0,

    std::size_t  qty = 0, double disc_rate = 0.0}:

    Item_base(book, sales_price),

    min_qty(qty),

    discount(disc_rate) {}

  protected:

    std::size_t quantity;

    double discount;

}

 

class Bulk_item : public Disc_item

public:

  Bulk_item(const std::string& book="",

    double sales_price = 0.1,

    std::size_t qty = 0, double disc_rate = 0.0):

    Disc_item(book, sales_price, qty, disc_rate) { }

 double net_price(std::size_t quantity) const;

 

 

这个类用来理解C++类比较好

1. Item_base构造类函数需要声明为public

2. 构造函数使用了默认实参,在构造时,不传参会使用默认实参构造

    Item_base item_base = new Item_base(,);

3. : isbn(book),price(sales_price) 相当于

Item_base(const std::string &book = "", double sales_price = 0.0):

{

    isbn = book;

    price = sales_price;

}

特别注意构造器中变量赋值的顺序不是形参顺序,而是变量申明顺序,既如下顺序

protected:
  double price;
private:
  std::string isbn;

4.对于派生类来说,派生类在构造自己时,先构造基类,再构造派生类。

 

 

关于修饰符

public - 允许其他类访问

protected - 只允许子类访问

private - 不允许其他类访问,包括子类

C:\Users\Administrator\Documents\贪吃蛇.cpp In function 'void initGame(Snake&, Food&)': 33 40 C:\Users\Administrator\Documents\贪吃蛇.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 33 16 C:\Users\Administrator\Documents\贪吃蛇.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 33 16 C:\Users\Administrator\Documents\贪吃蛇.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 33 16 C:\Users\Administrator\Documents\贪吃蛇.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 33 16 C:\Users\Administrator\Documents\贪吃蛇.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 33 16 C:\Users\Administrator\Documents\贪吃蛇.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 33 16 C:\Users\Administrator\Documents\贪吃蛇.cpp [Error] no match for 'operator=' (operand types are 'std::vector<_COORD>' and '<brace-enclosed initializer list>') 33 16 C:\Users\Administrator\Documents\贪吃蛇.cpp [Note] candidate is: 69 0 d:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\vector In file included from d:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\vector 5 C:\Users\Administrator\Documents\贪吃蛇.cpp from C:\Users\Administrator\Documents\贪吃蛇.cpp 160 5 d:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\vector.tcc [Note] std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = _COORD; _Alloc = std::allocator<_COORD>] 160 5 d:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\vector.tcc [Note] no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'con
03-28
<think>好的,用户遇到了C++编译器警告和错误,特别是关于extended initializer lists和operator=的问题。我需要先理解这些错误的具体原因,然后给出解决方案。 首先,用户提到编译器提示“extended initializer lists only available with -std=c++11”。这表明用户使用了C++11中的初始化列表特性,但编译器没有启用C++11模式。在C++98中,初始化聚合型(如数组、结构体)时,不能使用大括号{}的列表初始化,而C++11扩展了这一功能。因此,用户需要确保编译器使用C++11或更高标准进行编译。解决方法是添加编译选项-std=c++11或-std=gnu++11[^1][^2]。 接下来是“error: operator= brace-enclosed initializer list”。这可能是因为用户尝试用大括号初始化列表给不支持列表初始化的对象赋值。例如,在C++98中,vector的operator=不接受初始化列表,需要使用构造函数或push_back方法。用户需要检查代码中是否有似vector<int> v; v = {1,2,3};的语句,并修改为C++98兼容的方式,比如先声明并初始化,或者逐个添加元素[^2]。 另外,用户提到vector相关的问题。在C++98中,vector的初始化也需要使用构造函数,而不能直接使用初始化列表。例如,应该用vector<int> v(3, 0);来初始化为三个0,而不是用{}。同时,范围for循环在C++98中也不支持,需要使用传统的循环结构。 需要提醒用户检查代码中是否还有其他C++11的特性,比如auto关键字、lambda表达式等,这些在C++98中都是无效的。建议用户升级到C++11或更高标准以获得更好的支持,或者修改代码以符合C++98的规范。 最后,可能需要用户提供具体的代码示例,以便更准确地定位问题,但根据现有信息,上述解决方案应该能覆盖大部分情况。</think>针对C++编译器报错`extended initializer lists`和`operator=`相关错误,以下是逐步解决方案: --- ### 1. 理解错误原因 - **错误1**:`warning: extended initializer lists only available with -std=c++11` - **原因**:使用了C++11的初始化列表语法(如`{}`初始化对象),但编译器默认使用C++98标准 - **错误2**:`error: no match for 'operator=' with a brace-enclosed initializer list` - **原因**:在C++98中,STL容器(如`vector`/`map`)无法直接通过`{}`赋值或初始化[^2] --- ### 2. 解决方案 #### 方法一:启用C++11标准(推荐) 在编译命令中添加`-std=c++11`或`-std=gnu++11`标志: ```bash g++ -std=c++11 your_code.cpp -o output ``` #### 方法二:修改代码适配C++98 **场景1:初始化`vector`** ```cpp // C++11允许的写法(需加编译选项) std::vector<int> v = {1,2,3}; // C++98兼容写法 int temp[] = {1,2,3}; std::vector<int> v(temp, temp + sizeof(temp)/sizeof(int)); ``` **场景2:初始化`map`** ```cpp // C++11允许的写法(需加编译选项) std::map<std::string, int> m = {{"apple",1}, {"banana",2}}; // C++98兼容写法 std::map<std::string, int> m; m.insert(std::make_pair("apple", 1)); m.insert(std::make_pair("banana", 2)); ``` **场景3:`operator=`赋值** ```cpp // C++11允许的写法(需加编译选项) std::vector<int> v; v = {4,5,6}; // C++98兼容写法 int temp[] = {4,5,6}; v.assign(temp, temp + sizeof(temp)/sizeof(int)); ``` --- ### 3. 关键原理 1. C++98未定义`std::initializer_list`型,因此无法处理大括号初始化列表[^1] 2. STL容器的赋值运算符在C++98中不接受初始化列表参数 3. C++11引入的统一初始化语法需要显式启用标准 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值