Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2012, 17:43   #1
Prin53
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 59
По умолчанию Наследование классов. Ошибка.

Ошибка в инициализации объектов класса cChip и CSteamer. Что не так?
PHP код:
#include <iostream>
#include <conio.h>
#include <string>
 
using namespace std;
 
 
class 
cEngine
{
private:
    
int power;
    
string firm;
    
string type
 public:
    
void Set_cEngine(int Powerstring Firmstring Type)
    {
        
power Power;
        
firm Firm;
        
type Type;
    }
    
cEngine(int Powerstring Firmstring Type)
    {
        
power Power;
        
firm Firm;
        
type Type;
    }
};
 
class 
cChip
{
  
cEngineengine;
  
int displacement;
  
int tonnage;
  
stringname;
  
stringport;

public:
    
cChip(cEngineEngine,
                 
int Displacement,  
                 
int Tonnage,  stringName
                 
stringPort)
  {
      
cEngineengine Engine;
      
displacement Displacement;
      
tonnage Tonnage;
      
name Name;
      
port Port;
  }
    
void show_cChip()
  {
      
cout <<"Мощность двигателя: "<<engine<<" лс."<<endl<< "Название коробля: "<<name<<endl<<"Порт приписки " <<port<<endl<<"Тоннаж "<<tonnage<<endl<<"Водоизмещение ">>ddisplacement;
  }
};
 
class 
cSteamer : public cChip
{
    
int capacity;
public:
    
cSteamer(cEngineEngine
                       
int Capacityint Displacement
                       
int Tonnage,  stringName,  
                       
stringPort
                       : 
cChip (EngineDisplacementTonnageNamePort
    {
        
capacity Capacity;
    }
    
void show_cSteamer()
    {
        
show_cChip();
        
cout<<"\nВместительность "<< capacity <<"чел."<< endl;
    }
};

 
void main()
{
    
cEngine engine(25000"Porsche""Super Power");
    
cChip chip(engine250000040000"Aurora""Artur");
    
cEngine engine2(20000"Porsche""Super Power II");
    
cSteamer steamer(engine21504000025000"Barracuda""Aventura");
    
chip.show_cChip();
    
steamer.show_cSteamer();
    
cout << endl;
    
system ("pause");


Ошибки:
Цитата:
1>g:\ооп\лр6\lr2\lr2\исходный код.cpp(40): error C2440: инициализация: невозможно преобразовать "cEngine" в "cEngine *"
1> Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
1>g:\ооп\лр6\lr2\lr2\исходный код.cpp(48): error C2065: ddisplacement: необъявленный идентификатор
1>g:\ооп\лр6\lr2\lr2\исходный код.cpp(57): error C2664: cChip::cChip(cEngine,int,int,std::s tring *,std::string *): невозможно преобразовать параметр 1 из "cEngine *" в "cEngine"
1> Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
1>g:\ооп\лр6\lr2\lr2\исходный код.cpp(71): error C2664: cChip::cChip(cEngine,int,int,std::s tring *,std::string *): невозможно преобразовать параметр 4 из "const char [7]" в "std::string *"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>g:\ооп\лр6\lr2\lr2\исходный код.cpp(73): error C2664: cSteamer::cSteamer(cEngine *,int,int,int,std::string *,std::string *): невозможно преобразовать параметр 1 из "cEngine" в "cEngine *"
1> Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен

Последний раз редактировалось Prin53; 10.12.2012 в 19:46.
Prin53 вне форума Ответить с цитированием
Старый 10.12.2012, 18:16   #2
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Ну например, потому-что при инициализации класса cChip вы пытаетесь инициализировать его еще не объявленным объектом класса cEngine.
Тоже и с cSteamer
Suby вне форума Ответить с цитированием
Старый 10.12.2012, 18:18   #3
Prin53
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Suby Посмотреть сообщение
Ну например, потому-что при инициализации класса cChip вы пытаетесь инициализировать его еще не объявленным объектом класса cEngine.
Тоже и с cSteamer
Код:
cEngine engine(25000, "Porsche", "Super Power");
А это что тогда?
Prin53 вне форума Ответить с цитированием
Старый 10.12.2012, 19:33   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

просит указатель указатель:

Код:
cSteamer(cEngine* Engine,
подсовываешь объект:
Код:
cEngine engine2(20000, "Porsche", "Super Power II"); 
    cSteamer steamer(engine2,
На будущие: задаешь вопрос - уважай людей, которые будут разбираться в твоем коде.

Не пиши слишком длинные строки. Если появился горизонтальный скроллинг - значит отформатируй так, что бы его не было.

И приводи ошибку компилятора. Или ты типа тест на внимательность устроил?
_Bers вне форума Ответить с цитированием
Старый 10.12.2012, 19:47   #5
Prin53
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 59
По умолчанию

Приношу извинения, подправил.

Вы хотели сказать, что конструктор просит указатель, а я засылаю объект?
Prin53 вне форума Ответить с цитированием
Старый 10.12.2012, 19:53   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Prin53 Посмотреть сообщение
Приношу извинения, подправил.

Вы хотели сказать, что конструктор просит указатель, а я засылаю объект?
Да

Код:
void main() 
{ 
    cEngine engine(25000, "Porsche", "Super Power"); 
    cChip chip(engine, 2500000, 40000, "Aurora", "Artur"); 

    //здесь ты создал объект
    cEngine engine2(20000, "Porsche", "Super Power II"); 

    //здесь ты его скормил стримиру
    cSteamer steamer(engine2, 150, 40000, 25000, "Barracuda", "Aventura"); 
    chip.show_cChip(); 
    steamer.show_cSteamer(); 
    cout << endl; 
    system ("pause"); 
}

А стример у тебя просит указатель. Смотри самый первый аргумент конструктора:

Код:
cSteamer(cEngine* Engine,  int Capacity, int Displacement,  int Tonnage,  string* Name, string* Port)  
       : cChip (Engine, Displacement, Tonnage, Name, Port)
И кстати, компилятор тебе прямо об этом и написал:

error C2440: инициализация: невозможно преобразовать "cEngine" в "cEngine *"

Ожидается указатель, а подсунули объект.

Попробуй написать вот так:



Код:
void main() 
{ 
    cEngine engine(25000, "Porsche", "Super Power"); 
    cChip chip(engine, 2500000, 40000, "Aurora", "Artur"); 

    //здесь ты создал объект
    cEngine engine2(20000, "Porsche", "Super Power II"); 

    //здесь ты скармливаешь его адрес
    cSteamer steamer(&engine2, 150, 40000, 25000, "Barracuda", "Aventura"); 
    chip.show_cChip(); 
    steamer.show_cSteamer(); 
    cout << endl; 
    system ("pause"); 
}

Последний раз редактировалось _Bers; 10.12.2012 в 19:57.
_Bers вне форума Ответить с цитированием
Старый 10.12.2012, 20:01   #7
Prin53
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 59
По умолчанию

Спасибо, там дело было еще в ссылках на String.
Prin53 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование классов (С++) MayhemWithMercy Помощь студентам 4 01.10.2012 12:08
C++ наследование классов. очень простая ошибка, немогу разобраться в выводе при одинаковых массивах Sanu0074 Помощь студентам 1 02.06.2010 10:33
наследование классов Dimarik Общие вопросы C/C++ 15 02.07.2009 20:00