C ++ вызывающие функции - PullRequest
       29

C ++ вызывающие функции

2 голосов
/ 21 февраля 2012

Я новичок в C ++, и у меня есть проблема, которую компилятор выдает мне всякий раз, когда я компилирую свою программу. Из того, что я узнал до сих пор, у вас есть класс, в котором вы объявляете конструкторы и функции. Затем после занятий вы реализуете функции. Тогда в основном ты их называешь / манипулируешь. Я писал программу для связанных списков, но продолжал получать эту надоедливую ошибку компилятора:

ошибка: запрос на член 'get_number' в 'test', который относится к неклассному типу 'LinkList*'

Моя оригинальная программа была намного длиннее, чем приведенная ниже, но, поскольку я продолжал получать вышеуказанную ошибку, я написал действительно простую программу, просто чтобы увидеть, где выдается ошибка. Несмотря на то, что я написал это очень просто, я получил ТОЧНУЮ ошибку. Поэтому я делаю что-то не так, когда вызываю функцию, которую я объявил и реализовал.

Если бы кто-то мог просто помочь мне указать, что я делаю неправильно и почему я не могу вызвать эту функцию:

#include <iostream>
using namespace std;

class LinkList 
{
public:
    int result;

    //declaring the constructor
    LinkList(int i);

    //declaring simple function
    int get_number();
};

//Implementing the constructor
LinkList::LinkList(int i) 
{
    result = i; 
};

//implementing test function
int LinkList::get_number()
{
    return result;
}

int main()
{
    LinkList *test = new LinkList(5);

    int getting_number = 0;

    //Error trigger:
    test.get_number();

    cout<<getting_number;

    return 0;
}

Ответы [ 6 ]

4 голосов
/ 21 февраля 2012

Test - это указатель на объект LinkList, вам нужно получить доступ к свойствам и членам в тесте, используя оператор стрелки (->), например: test-> get_number ();

Или вы можете простоне создавать указатель на объект, а создавать обычный объект.

3 голосов
/ 21 февраля 2012

просто используйте

LinkedList test(5);

вместо

LinkList *test = new LinkList(5);

, если вы настаиваете на использовании нового варианта, вам нужно изменить

test.get_number();

на

test->get_number();

и освободите (удалите) ваш тестовый объект перед выходом из функции;

и даже тогда вы не назначаете возвращаемое значение из get_number для чего-либо, поэтому ваша переменная get_number varaible по-прежнему равна 0;

3 голосов
/ 21 февраля 2012

Объекты в C ++ находятся либо в автоматическом хранилище , либо в динамическом хранилище (есть также статическое хранилище , но это выходит за рамки вопроса).

Когда вы создаете объект с new, вы создаете его в динамическом хранилище и возвращаете указатель на него.

Члены объекта, на который ссылается указатель, доступны с помощью оператора ->:

test->get_number();

что эквивалентно:

(*test).get_number();

Бонусный балл 1:

У вас также есть утечка памяти в вашей программе, так как память, выделенная для test, никогда не освобождается. Вам нужно явно позвонить delete test, чтобы освободить его. (в данном случае это не фактическая утечка памяти, поскольку система освобождает память при выходе из программы, но вы должны знать об этом в будущем).

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

LinkedList test(5);
//...
test.get_number();

Таким образом, вам не нужно беспокоиться об управлении памятью, а также предпочтительнее использовать автоматически управляемые объекты вместо динамических.

Бонусный балл 2:

В c ++ типы, не относящиеся к модулю, инициализируются перед входом в тело конструктора, поэтому вам следует начать использовать списки инициализаторов:

LinkList::LinkList(int i) :
result(i) 
{
};

Это предотвращает двойную инициализацию и является простым приемом оптимизации. Даже если для этого конкретного случая разница не заметна, вы должны начать привыкать к инициализации таких членов как можно раньше.

0 голосов
/ 21 февраля 2012

Хорошо, я скажу "остановись прямо здесь".Это не Java и это не C #.Это C ++.В Java и C # вы всегда создаете свои объекты с новыми.

В C ++ вы не всегда создаете их таким образом.

Ваш лучший код будет просто:

int main() 
{     
    LinkList test(5);
    int getting_number = test.get_number();      
    std::cout<<getting_number << '\n';      
    return 0; 
} 
0 голосов
/ 21 февраля 2012

Ошибка правильная.test - это LinkedList*, указатель на LinkedList.Вы должны позвонить с test->get_number().Точечный вызов только для типов без указателей.

0 голосов
/ 21 февраля 2012

test не сам LinkList, а указатель на него.Следовательно,

test.get_number();

должно быть:

test->get_number();

Это просто сокращение для:

(*test).get_number();
...