初始化列表中的自定义类对象

Custom class object in Initialization list

本文关键字:对象 自定义 列表 初始化      更新时间:2023-10-16

>我有一个类栏:

class Bar
{
public:
Bar(void);
~Bar(void);
};

一个类Foo获取对Bar对象的引用作为构造函数参数,并需要将其保存在私有成员bar_中:

class Foo
{
private:
Bar& bar_;
public:
Foo(Bar& bar) : bar_(bar) {}
~Foo(void) {}
};

这不会编译:

在"Foo"中找不到重载成员函数

缺少类型说明符 - 假定为 int。注意:C++不支持默认整数

现在我怀疑我需要保证的几件事,第二个错误是Bar& bar_; Foo声明。声明bar_时是否需要使用显式构造函数?

我有兴趣了解编译器在这件事上是如何工作的,因此非常感谢详细的解释。

谢谢。

编辑

好的,我正在发布一个新代码,因为显然我的代码没有任何问题。 Parser.h

#pragma once
class Parser
{
private:
std::istream& inputStream_;
Analyzer& analyzer_;
public:
Parser(std::istream &inputStream, Analyzer& analyzer);
~Parser(void);
};

Parser.cpp

#include "stdafx.h"
#include "Parser.h"
#include "Analyzer.h"
Parser::Parser(std::istream &inputStream, Analyzer& analyzer ) : inputStream_(inputStream),     analyzer_(analyzer) {}
Parser::~Parser(void) {}

Analyzer.h

 #pragma once
class Analyzer
{
public:
    Analyzer(void);
    ~Analyzer(void);
};

这不会编译:

overloaded member function not found in 'Foo'    
missing type specifier - int assumed. Note: C++ does not support default-int

您提供的代码片段确实可以编译。不过,我可以告诉你一些关于这些错误的信息。

当您编译的方法与类中声明的同名方法具有相同名称但签名不同时,会发生第一条错误消息。 例如,如果您有:

class A {
public:
    int foo (int);
};
int A::foo () { return 0; }

编译器将发出有关找不到重载成员函数的错误。编译器认为foo是重载的,因为foo(void)foo(int)不同。

定义

没有类型的变量或函数时,会发生第二个错误。这通常不是实际问题,而是其他问题的结果。例如,如果您的代码在声明类之前尝试使用该类,例如:

B b;
class B {};

你会得到关于缺少类型说明符的第二个错误,但它在第一行谈论的是B