2013-08-15 5 views
1

Я столкнулся с этим вопросом в онлайн-тесте, которое я принимал. Задача состоит в том, чтобы изменить эту программу, чтобы избавиться от ошибок компиляции.Доступ к вложенному классу в C++

#include<iostream> 
#include<iomanip> 

class Vehicle 
{ 
public: 
    static Car* createCar() 
    { 
     return new Car; 
    } 

    class Car 
    { 
     public: 
      string name; 
    }; 
private: 
    int seats; 
}; 

void useVehicle() 
{ 
    Vehicle::Car *c = Vehicle::createCar(); 
    c->name = "BMW"; 
} 

int main(int argc, char *argv[]) 
{ 
    useVehicle(); 
    return 0; 
} 

сборниках ошибки как:
error: ‘Car’ does not name a type
error: ‘string’ does not name a type
В функции void useVehicle():
error: ‘createCar’ is not a member of ‘Vehicle’

Как я могу получить это право? Я пробовал несколько вещей, но не мог решить эти ошибки.

+0

Будьте более конкретным в том, что вы пробовали и что произошло, когда вы это сделали. – chris

+0

[Вот рабочая версия вашего кода] (http://coliru.stacked-crooked.com/view?id=b5a879f37c395a9f5701b9fbbee730f7-f674c1a6d04c632b71a62362c0ccfc51) –

+0

Являются ли вложенные классы C++ 11? Я не видел их раньше на этом языке. – Panzercrisis

ответ

6

error: ‘Car’ does not name a type

В точке

static Car* createCar() 

автомобиль пока не известно. Переместить определение класса Car выше функции

error: ‘string’ does not name a type In function ‘void useVehicle()’:

#include <string> 

также использовать std:: квалифицироваться string

error: ‘createCar’ is not a member of ‘Vehicle’

Эта ошибка исчезнет, ​​как только вы исправить две другие проблемы. Компилятор не смог разобрать объявление функции, поскольку он не знал, каков его тип возврата.

Смежные вопросы