Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
1

Найти причины возникновения ошибок в коде и исправить эти ошибки

13.09.2016, 18:37. Показов 1830. Ответов 15
Метки нет (Все метки)

Уважаемые форумчане, тут вот изучал дружественные методы, классы и функции и наткнулся вот на токую проблему,
найти ответ на нее сразу не удалось, в источнике все работало(на видео), там использовали стандарт с++11, у меня mvs-2013
Вот собственно код(один в один как на видео):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A1;
 
class B1{
public:
  void append(A1 const& a){ append(a.str); }               //Ругается на (a.str)
  void append(char const* str){ cout << str << endl; }
};
 
class A1{
private:
  char* str;
  size_t len;
public:
  A1(char* str = 0, size_t len = 0) : str(str), len(len){};
  friend void B1::append(A1 const& a);
};
 
void B1::append(A1 const& a){ append(a.str); }         //Ругается на (a.str)
А вот пачка ошибок что выдает мой компилятор:

Код
member "A1::str" (declared at line 11) is inaccessible       *Номер линии подогнан под данный кусок кода*
left of '.str' must have class/struct/union
function 'void B1::append(const A1 &)' already has a body
use of undefined type 'A1'
Как я понял, это по сути 1 ошибка, мол определение вызова полей соседнего класса идет раньше чем само определение класса(и полей) к которому определяется данный вызов.
Прошу объяснить мне максимально подробно(почему так и как это обойти), так сказать пояснение для чайника.
Заранее благодарен всем кто откликнется.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2016, 18:37
Ответы с готовыми решениями:

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

Найти причины возникновения ошибок в коде и исправить эти ошибки
Имеется две формулы (поиск следующего приближения для метода SOR):...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Уважаемые пользователи просьба помочь с одной проблемой,смысл в том что при создании записи она...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Всем хай. Во-первых, vs не видит в мейне V и говорит, что она не инициализирована, но на идеоне оно...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
15
Эксперт CЭксперт С++
5054 / 2241 / 330
Регистрация: 20.02.2013
Сообщений: 5,601
Записей в блоге: 24
13.09.2016, 18:46 2
Chronid, str - это не функция-член, а данные. А ты пытаешься обращаться к данным, как будто они у тебя функция-член. Компилятор такого не пропустит.

Вот это тоже парафин полный:
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
str(str), len(len)
Придерживайся какого-то соглашения при именовании мемберов, например:
C++
1
str_(str), len_(len)
или так:
C++
1
m_str(str), m_len(len)
Добавлено через 2 минуты
В функции-члене append() в реализации опять её же рекурсивно вызываешь (5 строка кода). А чего этот append() должен делать, компилятор, видимо должен догадаться, да?
1
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
13.09.2016, 18:48 3
ну и обращение к методам/полям не полного класса
1
Эксперт CЭксперт С++
5054 / 2241 / 330
Регистрация: 20.02.2013
Сообщений: 5,601
Записей в блоге: 24
13.09.2016, 18:52 4
Chronid, и вообще, внятно напиши чего хотел сделать (техзадание).

Добавлено через 3 минуты
Цитата Сообщение от Chronid Посмотреть сообщение
один в один как на видео
А вот и причина всех ошибок. Книжки читай. Обучаться плюсам по видео - тупиковый путь.
0
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
13.09.2016, 18:55  [ТС] 5
Цитата Сообщение от gru74ik Посмотреть сообщение
str - это не функция-член, а данные. А ты пытаешься обращаться к данным, как будто они у тебя функция-член.
Обожди, где это я обращаюсь к полю как к функции?

Цитата Сообщение от gru74ik Посмотреть сообщение
В функции-члене append() в реализации опять её же рекурсивно вызываешь (5 строка кода). А чего этот append() должен делать, компилятор, видимо должен догадаться, да?
Посмотри внимательно, здесь перегрузка методов.
Цитата Сообщение от Chronid Посмотреть сообщение
void append(A1 const& a){ append(a.str); } //Ругается на (a.str)
void append(char const* str){ cout << str << endl; }
Компилятор различает эти функции(методы) успешно, по получаемым ими параметрам.
0
Эксперт CЭксперт С++
5054 / 2241 / 330
Регистрация: 20.02.2013
Сообщений: 5,601
Записей в блоге: 24
13.09.2016, 18:59 6
 Комментарий модератора 
Chronid, ещё раз (выдержка из правил форума):
п. 4.7. Как можно более полно описывайте суть проблемы или вопроса, что было сделано для ее решения и какие результаты получены.

И поэтому:
Цитата Сообщение от gru74ik Посмотреть сообщение
внятно напиши чего хотел сделать (техзадание)
Добавлено через 58 секунд
Цитата Сообщение от Chronid Посмотреть сообщение
Обожди, где это я обращаюсь к полю как к функции?
в 5-й и 18-й строке кода:
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
a.str
0
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
13.09.2016, 18:59  [ТС] 7
Цитата Сообщение от gru74ik Посмотреть сообщение
А вот и причина всех ошибок. Книжки читай. Обучаться плюсам по видео - тупиковый путь.
Спасибо за совет, книжки я тоже читаю, на работе в основном
А видео смотрю вроде как не абы какое, вот ссылка
https://stepic.org/lesson/%D0%... B&unit=884
0
Эксперт CЭксперт С++
5054 / 2241 / 330
Регистрация: 20.02.2013
Сообщений: 5,601
Записей в блоге: 24
13.09.2016, 19:03 8
Chronid, и да, покажи полностью код, который пытаешься скомпилировать.
0
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
13.09.2016, 19:12  [ТС] 9
Цитата Сообщение от gru74ik Посмотреть сообщение
внятно напиши чего хотел сделать (техзадание)
Я хочу понять, как и написал выше, почему так и как это обойти.
Поймите меня правильно, заниматься самообучением очень тяжелый и болезненный способ(а другого у меня сейчас нет),
в книжках и видео-уроках хоть и описано многое, но периодически возникают вопросы на которые там нет ответов.
Я думаю вы это итак прекрасно знаете, здесь легко нахвататься "вредных привычек", и потом ооооочень долго от них избавляться.
Поэтому я и пишу сюда в надежде найти помощь. Ну и периодически штудирую похожие темы, если они есть, вопросы на которые у меня появляются.

Добавлено через 2 минуты
Цитата Сообщение от gru74ik Посмотреть сообщение
Chronid, и да, покажи полностью код, который пытаешься скомпилировать.
Это весь код, ниже только пустая функция main, ну а выше подключаемый модуль ввода вывода потоков и разрешение на пространство имен.
0
Эксперт С++
8421 / 3954 / 866
Регистрация: 15.11.2014
Сообщений: 8,904
13.09.2016, 19:16 10
Лучший ответ Сообщение было отмечено Chronid как решение

Решение

Цитата Сообщение от Chronid Посмотреть сообщение
Как я понял,
есть единственное правильное понимание, которое вам нужно знать:

в строке 1 вы сообщаете о существовании класса A1
но никаких других подробностей.
компилятор не знает из чего он состоит

в строке 5 вы пытаетесь обращаться к членам класса A1,
о существовании которых он на этот момент ещё ничего не знает.

компилятор не понимает что такое str
нигде выше по тексту не было никаких упоминаний о нем.

лекарство:

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
28
29
30
#include <iostream>
using namespace std;
 
class A1;
 
class B1{
public:
  void append(A1 const& a);
  void append(char const* str){ cout << str << endl; }
};
 
class A1{
private:
  char* str;
  size_t len;
public:
  A1(char* str = 0, size_t len = 0) : str(str), len(len){};
  friend void B1::append(A1 const& a);
};
 
 
void B1::append(A1 const& a){ append(a.str); }   //<--- в этой строке 
 // компилятор уже знает полное строение класса A1,
 // и что такое str
 
 
int main()
{
    std::cout << "Hello, world!\n";
}
2
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
13.09.2016, 19:16  [ТС] 11
И да, я перепроверил 5-ю строку кода
Цитата Сообщение от Chronid Посмотреть сообщение
void append(A1 const& a){ append(a.str); }
Здесь идет обращение к полю "str" класса "а", а именно передача его значения в следующий метод "append"
0
Эксперт CЭксперт С++
5054 / 2241 / 330
Регистрация: 20.02.2013
Сообщений: 5,601
Записей в блоге: 24
13.09.2016, 19:21 12
Цитата Сообщение от Chronid Посмотреть сообщение
Я хочу понять, как и написал выше, почему так и как это обойти.
Это не техзадание. Это просто какой-то бессмысленный набор фраз. Техзадание должно:
  1. чётко формулировать проблему ("хочу сделать то-то с тем-то и тем-то")
  2. определять список инструментов для решения задачи (IDE, фреймворки, библиотеки, функции, классы, средства определённого стандарта и т.д.)
  3. описывать цель (ожидаемое поведение программы)
  4. содержать минимально компилируемый код
  5. описывать симптоматику ("вместо того, что ожидается, происходит то-то и то-то"), содержать скрины ошибок

Например:
  1. Формулировка проблемы:
    Найти сумму элементов главной диагонали квадратной матрицы заданного размера.
  2. Список средств для решения задачи:
    Нельзя использовать Boost, STL (за исключением ввода/ вывода) и другие библиотеки и фреймворки. Разрешается использовать пользовательские функции и классы. Разрешается использовать любые средства стандарта C++11 (кроме лямбда-функций), если это не противоречит предыдущим ограничениям. Код оформить как многофайловый проект в среде разработки Code::Blocks.
  3. Ожидаемое поведение:
    В цикле for (в строках кода с 5-10) пытаюсь организовать подсчёт значений элементов главной диагонали. Ожидаемый результат 42.
  4. Минимально компилируемый код:
    C++
    1
    
    // some code here
  5. Симптоматика:
    Вместо правильного ответа получаю результат 666 (скиншот).
2
rikimaru2013
13.09.2016, 19:27
  #13

Не по теме:

Написал тоже самое, что и hoggy первее - но ему все лавры. Жизнь не справедлива! :(

0
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
13.09.2016, 19:27  [ТС] 14
hoggy, Премного благодарен!

Запарился я тут, написал определение метода, хотя нужно было только объявление.
Цитата Сообщение от Chronid Посмотреть сообщение
void append(A1 const& a){ append(a.str); }
Спасибо всем за помощь.

gru74ik, Не серчай батя, нас таких много, на всех нервов не хватит. И отдельное спасибо за терпение
0
Эксперт CЭксперт С++
5054 / 2241 / 330
Регистрация: 20.02.2013
Сообщений: 5,601
Записей в блоге: 24
13.09.2016, 19:38 15
Цитата Сообщение от Chronid Посмотреть сообщение
gru74ik, Не серчай батя
Да я не серчаю. Я и сам учусь. Вот буквально только что узнал, что к данным-членам, оказывается, можно как к функциям-членам через точку обращаться, а думал, что нельзя.
Потестировал код hoggy, работает:
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
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
class A1;
 
class B1{
public:
  void append(A1 const& a);
  void append(char const* str){ cout << str << endl; }
};
 
class A1{
private:
  char* str_;
  size_t len_;
public:
  A1(char* str = 0, size_t len = 0) : str_(str), len_(len) {}
  friend void B1::append(A1 const& a);
};
 
 
void B1::append(A1 const& a){ append(a.str_); }   //<--- в этой строке
 // компилятор уже знает полное строение класса A1,
 // и что такое str
 
 
int main()
{
    A1 objA1( "Abrahadabra", 20);
    B1 objB1;
    objB1.append( objA1 );
    objB1.append( "Pazyazya" );
 
    return 0;
}
0
Миниатюры
Найти причины возникновения ошибок в коде и исправить эти ошибки  
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
13.09.2016, 19:45  [ТС] 16
Цитата Сообщение от gru74ik Посмотреть сообщение
Вот буквально только что узнал, что к данным-членам, оказывается, можно как к функциям-членам через точку обращаться, а думал, что нельзя.
gru74ik, А к ним, только через точку и идет обращение, если это не через указатель а напрямую, отличие полей от функций заключается в округлых скобках, если они есть значит идет обращение к функции, если нет значит это поле данных.
C++
1
2
a.str;                          //Это обращение к полю
a.str();                       //А это обращение к функции (когда обращаешся к функции, круглые скобки обязательны)
Как раз такие скобки и говорят компилятору, что тут идет обращение к функции, даже когда она не принимает входящих параметров.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2016, 19:45

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Найти причины возникновения ошибок в коде и исправить эти ошибки
помогите пожалуйста исправить ошибку вот код в с++ // ConsoleApplication9.cpp: определяет точку...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Совсем я запуталась. Опять куча ошибок. Помогите разобраться, пжлст. П.5.18.Правил Запрещено...

Найти причины возникновения ошибок в коде и исправить эти ошибки
не пойму что он от меня хочет #include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream.h&gt;...

Найти причины возникновения ошибок в коде и исправить эти ошибки
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;iterator&gt; #include &lt;algorithm&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.