C++ 初始化列表中的自定义类对象
我有一个班级酒吧:C++ 初始化列表中的自定义类对象,c++,constructor,initialization,C++,Constructor,Initialization,我有一个班级酒吧: class Bar { public: Bar(void); ~Bar(void); }; 以及一个类Foo,该类获取对Bar对象的引用作为构造函数参数,并需要将其保存在私有成员Bar中: class Foo { private: Bar& bar_; public: Foo(Bar& bar) : bar_(bar) {} ~Foo(void) {} }; 这不会编译: overloaded member function not found in '
class Bar
{
public:
Bar(void);
~Bar(void);
};
以及一个类Foo
,该类获取对Bar
对象的引用作为构造函数参数,并需要将其保存在私有成员Bar
中:
class Foo
{
private:
Bar& bar_;
public:
Foo(Bar& bar) : bar_(bar) {}
~Foo(void) {}
};
这不会编译:
overloaded member function not found in 'Foo'
missing type specifier - int assumed. Note: C++ does not support default-int
在“Foo”中未找到重载成员函数
缺少类型说明符-假定为int。注意:C++不支持默认INT/P>
现在我怀疑有两件事我需要保证,第二个错误是针对Bar&Bar代码>在Foo
中声明。在声明bar\uUcode>时是否需要使用显式构造函数
我很想了解编译器是如何处理这个问题的,因此非常感谢您的详细解释
谢谢
编辑
好的,我发布了一个新代码,因为我的代码显然没有问题。
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
。代码很好(除了缺少Bar的c-tor和d-tor的定义外),您的错误消息提到了解析器
-这是什么?编译-它们是相关的。否决是因为你在发布问题之前没有检查它。好吧,不否决你:否决问题,这是完全不同的。@Michael-然后我们看到你应该在Parser.h文件中添加一个#include“Analyzer.h”
。