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

时间:2012-06-08 10:37:03

标签: 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) {}
};

这不编译:

  

'Foo'中找不到重载的成员函数

     

缺少类型说明符 - 假设为int。注意:C ++不支持default-int

现在我怀疑我需要确保的一些事情,第二个错误是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);
};

1 个答案:

答案 0 :(得分:1)

  

这不编译:

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