Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простой пример - непонятная ошибка, left of '.A' must have class/struct/unio 
:(
    Опции темы
PRIZRAK001
Дата 28.10.2007, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: нет
Всего: 1



Здравствуйте.

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;

Не пойму, в чём дело. Подскажите, пожалуйста! 
PM   Вверх
marcusmae
Дата 28.10.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Добрый день, PRIZRAK001, 

Код

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



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
JackYF
Дата 28.10.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Вообще говоря, странное поведение  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;                                                                                                                     
}



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 28.10.2007, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Вообще говоря странного мало 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;
    }


Это сообщение отредактировал(а) archimed7592 - 28.10.2007, 07:52


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 28.10.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
PRIZRAK001
Дата 28.10.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: нет
Всего: 1



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;
    }

Что ещё больше сбивает с толку!
PM   Вверх
marcusmae
Дата 28.10.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



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


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
archimed7592
Дата 28.10.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



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

Почему? smile


marcusmae, да.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
PRIZRAK001
Дата 29.10.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: нет
Всего: 1



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

int a;   // стек (stack)
int* b = new int;   // свободная память (free store)
int* c = (int*)malloc(sizeof(int));   // куча (heap)
Хотя... Часто кучу и свободную память называют одинаково.
PM   Вверх
JackYF
Дата 29.10.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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

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

new вызывает malloc.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
PRIZRAK001
Дата 29.10.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: нет
Всего: 1



archimed7592, разве это нормально, писать столько скобок?!
Код

ClassB B((ClassA()));

PM   Вверх
JackYF
Дата 29.10.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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

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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
PRIZRAK001
Дата 1.11.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: нет
Всего: 1



ОК. Всем спасибо за ответы.
PM   Вверх
archimed7592
Дата 2.11.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



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

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

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

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 2.11.2007, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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

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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.