Форум программистов, компьютерный форум CyberForum.ru

Взаимно ссылающиеся классы: 1)Правильное описание 2)ошибки IntelliSense - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Задача с массивом http://www.cyberforum.ru/cpp-beginners/thread1134887.html
Дана такая задача : Все правильно показывает до 6-й степени двойки, а дальше не правильные степени.. в чем ошибка? Выполнил ее вот так : #include <iostream> #include <cstdlib> #include <cmath> using namespace std;
C++ Разработать программу, определяющую принадлежит ли точка заданной фигуре Подскажите пожалуйста, зачем нужен "!" в выражении (x*x+y*y<=1 && !(x>0 && y<0)). Оно правильно только не понимаю для чего тут "!". Сама задача такова: Разработать программу, определяющую принадлежит ли точка заданной фигуре. http://www.cyberforum.ru/cpp-beginners/thread1134858.html
C++ Бинарные файлы
Помогите пожалуйста написать программы. Исходный файл формировать программно. Количество элементов исходного файла неизвестно. В файле содержатся числа. Сформировать из них матрицу, содержащую пять элементов в строке. Лишние числа отбросить. Вывести на печать матрицу в общепринятом виде и посчитать сумму элементов, содержащихся в предпоследней строке Благодарю всех, кто откликнется и...
Определите, является последовательность, содержащаяся в файле, знакопеременной C++
Пусть Дан Файл целых чисел.Определите,является последовательность,в нем содержащаяся знакопеременной.
C++ Считать из файла значения для формулы http://www.cyberforum.ru/cpp-beginners/thread1134822.html
Здравствуйте, доброго времени дня. У меня возникли некие вопросы. Задача такова считать файл и работать с ним. Точнее, из файла загнать случайные переменные (их там приблизительно 80, выбрать 1) и посчитать по формуле. Что у меня получилось, а получилось у меня считать файл и просматривать его, но ни как не удаеться поработать с ним, вот мой код: #include <string> #include <fstream> ...
C++ Программа для вывода русских букв Добрый день форумчане. Есть программа взятая с учебника, мной не однократно проверенная, на правильность списания, но отказывающая работать. Конечно есть куча других способов таких как настройка локали и т.п., но все таки хотелось бы разобраться где здесь собака зарыта) #include<iostream> #include<cstring> #include<new> #include<windows.h> #include"converts.h" using std::strlen;using... подробнее

Показать сообщение отдельно
SaShka K
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 55
31.03.2014, 16:07     Взаимно ссылающиеся классы: 1)Правильное описание 2)ошибки IntelliSense
Есть такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class A;                 //объявление кл. А (т.н. "forward declaration")
 
class E {                   //описание кл. Е
public:
   void static changeA(A&);
};
 
class A {                   //описание кл. А
public:
   A() : d(1) {};
   void show(void) {
      printf("d=%i",d);
   }
   friend void E::changeA(A&);
private:
   int d;
};
 
void E::changeA(A& x){  //определение метода E::changeA() тут (после описания кл. А), т.к. иначе ошибки
   x.d = 123;
}
 
void main(void) {
   A a;
   E::changeA(a);
   a.show();
}
получаю вывод: "d=123"

Тут приведен рабочий код. Изначально у меня были с ним проблемы, когда этот код имел структуру:

forward declaration кл. Е;
описание класса А (полное - вместе с его методами);
описание класса E (полное - вместе с его методами);


В этом случае компилятор ругался: "error C2027: использование неопределенного типа "E" ".
Мой первый вопрос: Подскажите пожалуйста, мне вот не ясно, ведь тип "Е" программа на самом деле уже видит, скорее всего (предполагаю) программа реально не видит при такой последовательности описаний классов не тип E, а его метод E::changeA(). Так ли это? (т.е. компилятор просто нечётко выражается, или это я не понимаю, чего-то).

Но эту проблему смог решить в виде приведённого выше кода — программа заработала.
Вопрос №2: можно ли как-то иначе было решить эту проблему (не перенося описание класса Е перед описанием А. В данном случае класс Е мне пришлось ещё и разорвать: описание класса Е пришлось поместить перед кл. А, а определение метода E::changeA() — после (метод пришлось оставить после А, т.к. он обращается к полю класса А).
Я пытался подобрать нечто вроде прототипа метода changeA() и его указать перед кл. А, тогда все описание Е не пришлось бы переносить, но не удалось (видимо просто невозможно объявить метод вне класса).

Последний 3-ий вопрос: в этом варианте кода всё работает верно, но, тем не менее, IntelliSense выдаёт ошибку (которая, впрочем, не мешает запустить программу):
"IntelliSense: член "A::d" (объявлено в строке 17) недоступно"
и подчёркивает его красным в тексте кода.
Собственно вопрос #3: Почему так? IntelliSense ошибается? (ведь доступно же и корректно выполняемая программа тому подтверждение!) Если действительно ошибается, то как на будущее определить, на какие сообщения IntelliSense об ошибках не стоит обращать внимание?

Благодарю за Вашу помощь!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru