Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Простой пример - непонятная ошибка


Автор: PRIZRAK001 28.10.2007, 00:13
Здравствуйте.

Visual Studio 2005. Пытаюсь скомпилировать код: 

Код

#include <iostream>

class ClassA
    {
    public:
        int Value;
        ClassA() : Value(3) {}    
    };

class ClassB
    {            
    public:    
        ClassA A;
        ClassB(ClassA a) : A(a) {}
    };

int main()
    {        
    ClassB B(ClassA());
    std::cout << B.A.Value << std::endl;
    }

В результате получаю сообщения об ошибках:

Код

error C2228: left of '.Value' must have class/struct/union
error C2228: left of '.A' must have class/struct/union

с указанием на строку: 

Код

std::cout << B.A.Value << std::endl;

Не пойму, в чём дело. Подскажите, пожалуйста! 

Автор: marcusmae 28.10.2007, 00:59
Добрый день, PRIZRAK001, 

Код

int main()
    {        
    ClassB* B = new ClassB(ClassA());
    std::cout << B->A.Value << std::endl; // 3
    }

Автор: JackYF 28.10.2007, 01:16
Вообще говоря, странное поведение  smile .

Решилось так:
Код

#include <iostream>                                                                                                                                          
class ClassA                                                                                                                                                 
{                                                                                                                                                            
    public:                                                                                                                                                  
        int Value;                                                                                                                                           
        ClassA() : Value(3) {}                                                                                                                               
};                                                                                                                                                           
class ClassB                                                                                                                                                 
{                                                                                                                                                            
    public:                                                                                                                                                  
        ClassA A;                                                                                                                                            
        ClassB(const ClassA& a) : A(a) {}                                                                                                                    
};                                                                                                                                                           
int main()                                                                                                                                                   
{                                                                                                                                                            
    ClassA aa;                                                                                                                                               
    ClassB B(aa);                                                                                                                                            
    std::cout << B.A.Value << std::endl;                                                                                                                     
}

Автор: archimed7592 28.10.2007, 07:52
Вообще говоря странного мало smile.
Код
SomeType someVar();

Что объявит эта строка? smile
Hint: ф-ции можно объявлять где-угодно.

Аналогично и здесь:
Код
int main()
    {        
    ClassB B(ClassA()); // ф-ция, принимающая один аргумент типа ClassA
    std::cout << B(ClassA()).A.Value << std::endl;
    }
ClassB B(ClassA(tmp))
{
    return ClassB(tmp);
}


Код
int main()
    {        
    ClassB B = ClassA(); // то что тебе нужно
    std::cout << B.A.Value << std::endl;
    }

Автор: JackYF 28.10.2007, 11:54
Цитата(archimed7592 @  28.10.2007,  07:52 Найти цитируемый пост)
Hint: ф-ции можно объявлять где-угодно.

тьху ты... второй раз напарываюсь...

Автор: PRIZRAK001 28.10.2007, 12:11
archimed7592, ты прав. Компилятор действительно думает, что это функция. 

Вот так работает:
Код

int main()
    {        
    ClassB B = ClassA();
    std::cout << B.A.Value << std::endl;
    }

Но и так тоже:    
Код

int main()
    {        
    ClassB B((ClassA()));
    std::cout << B.A.Value << std::endl;
    }

Что ещё больше сбивает с толку!

Автор: marcusmae 28.10.2007, 13:22
Хм, вот оно что. А я правильно понял, что отличие в том, что Ваша переменная будет заводиться в стеке, а моя - в куче?

Автор: archimed7592 28.10.2007, 17:27
Цитата(PRIZRAK001 @  28.10.2007,  12:11 Найти цитируемый пост)
Что ещё больше сбивает с толку! 

Почему? smile


marcusmae, да.

Автор: PRIZRAK001 29.10.2007, 00:09
Цитата(marcusmae @  28.10.2007,  13:22 Найти цитируемый пост)
Хм, вот оно что. А я правильно понял, что отличие в том, что Ваша переменная будет заводиться в стеке, а моя - в куче? 
Есть тонкий момент:
Код

int a;   // стек (stack)
int* b = new int;   // свободная память (free store)
int* c = (int*)malloc(sizeof(int));   // куча (heap)
Хотя... Часто кучу и свободную память называют одинаково.

Автор: JackYF 29.10.2007, 00:18
Цитата(PRIZRAK001 @  29.10.2007,  00:09 Найти цитируемый пост)
int* b = new int;   // свободная память (free store)
int* c = (int*)malloc(sizeof(int));   // куча (heap)

эти два вызовы аналогичны.

new вызывает malloc.

Автор: PRIZRAK001 29.10.2007, 00:22
archimed7592, разве это нормально, писать столько скобок?!
Код

ClassB B((ClassA()));

Автор: JackYF 29.10.2007, 00:59
Цитата(PRIZRAK001 @  29.10.2007,  00:22 Найти цитируемый пост)
писать столько скобок?!

ну, это еще терпимо.

И намного больше скобок бывает. Вот почему такие хитрые операторы лучше логически разбивать.
И длина строк поменьше, и компилятору легче оптимизировать...

Автор: PRIZRAK001 1.11.2007, 23:07
ОК. Всем спасибо за ответы.

Автор: archimed7592 2.11.2007, 00:17
Цитата(JackYF @  29.10.2007,  00:18 Найти цитируемый пост)
new вызывает malloc. 

Чё, правда что ль? smile
Хто сказал? smile

Добавлено через 2 минуты и 18 секунд
Цитата(PRIZRAK001 @  29.10.2007,  00:22 Найти цитируемый пост)
archimed7592, разве это нормально, писать столько скобок?!

Ммм, а что тебя смущает? Ну не пиши скобки, не пиши пробелы, вообще можешь не писать ничего. Если же ты хочешь получить какой-то результат, то придётся смириться с тем, что язык С++ так устроен. Можешь обратиться в комитет и, если ты их убедишь, то сделают новые правила языка.

Автор: JackYF 2.11.2007, 00:32
Цитата(archimed7592 @  2.11.2007,  00:17 Найти цитируемый пост)
Чё, правда что ль? smile
Хто сказал? smile

шутишь... я минуты 3 пытался понять, что ты этим хотел сказать.

Хорошо. new, как правило (в большинстве реализаций) вызывает malloc. Доволен?  smile 

Автор: archimed7592 2.11.2007, 00:42
Цитата(JackYF @  2.11.2007,  00:32 Найти цитируемый пост)
Доволен?  smile  

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)