Используя абстрактный класс в C++

Некоторые из этих ответов не работали так, как написано с Python 3, или не дали правильного представления для отрицательных чисел с плавающей запятой. Я нашел следующее для работы для меня (хотя это дает 64-битное представление, которое мне нужно)

def float_to_binary_string(f):
    def int_to_8bit_binary_string(n):
        stg=bin(n).replace('0b','')
        fillstg = '0'*(8-len(stg))
        return fillstg+stg
    return ''.join( int_to_8bit_binary_string(int(b)) for b in struct.pack('>d',f) )
16
задан seanhodges 16 March 2009 в 12:20
поделиться

9 ответов

Ваша проблема состоит в том, что необходимо принять ссылку в функции. Причина состоит в том, что ссылка на самом деле не копирует переданный аргумент. Если Вы однако принимаете A - вместо ссылки A& - тогда Вы на самом деле копируете аргумент, переданный в объект параметра, и что Вы получаете, объект типа A - но который на самом деле не позволяется!

    // the reference parameter will reference the actual argument
    void setInstance(A &newInstance) {
            // assign the address of the argument to the pointer member
            // instance. 
            instance = &newInstance;
    }

И затем необходимо будет изменить участника в классе, чтобы быть указателем. Это не может быть ссылка, потому что setInstance изменит то, на что это ссылается - ссылка может только сослаться на один объект в течение своего всего времени жизни, в то время как указатель может быть установлен указать, делают разные вещи только путем переприсвоения ему другого адреса. Остающиеся части похожи на это тогда

    void doSomething() {
        // call a member function on the object pointed to
        // by instance!
        instance->action();
    }

private:

    // a pointer to some object derived from A
    A *instance;

Также примечание, которое необходимо скомпилировать программы C++ с помощью g++, потому что оно дополнительно связывает библиотеку стандарта C++ с кодом

g++ -o test test.cpp # instead of gcc!
27
ответ дан 30 November 2019 в 16:14
поделиться

То, что Вы делаете, работало бы в Java, потому что объявление параметра или членской переменной типа "A" действительно означает "указатель на A". В C++ на самом деле необходимо быть явными об этом, так как они - две разных вещи:

void setInstance(A* newInstance) { // pointer to an "A"
                instance = newInstance;
}

И в объявлении:

A* instance; // Not an actual "A", but a pointer to an "A"
5
ответ дан 30 November 2019 в 16:14
поделиться

Вашей проблемой теперь является связь. Для программы C++ должна быть добавлена стандартная библиотека C++:

gcc-o тест -lstdc ++ test.cpp

3
ответ дан 30 November 2019 в 16:14
поделиться

Я полагаю, что это - то, что Вы пытаетесь сделать. Это демонстрирует полиморфизм путем фактического распечатывания чего-то в зависимости от того, указывает ли класс дескриптора на экземпляр B или C. Другие корректны, что Вы, вероятно, также хотели бы виртуальный деструктор.

Это компилирует с: g ++ test.cpp-o Тест

#include <stdio.h>

class A {
    public:
        virtual void action() = 0;
};

class B : public A {
    public:
        B() {}

        void action() {
                printf("Hello World\n");
        }
};

class C : public A {
    public:
        C() {}

        void action() {
                printf("Goodbye World\n");
        }
};

class AHandleClass {

    public:

        void setInstance(A *A_Instance) {
                APointer = A_Instance;
        }

        void doSomething() {
                APointer->action();
        }

    private:

        A *APointer;
};

int main(int argc, char** argv) {
    AHandleClass AHandle;
    B BInstance;
    C CInstance;
    AHandle.setInstance(&BInstance);
    AHandle.doSomething();
    AHandle.setInstance(&CInstance);
    AHandle.doSomething();
    return 0;
}
3
ответ дан 30 November 2019 в 16:14
поделиться

Необходимо сохранить как указатель.

A* instance;

Редактирование: я записал "ссылку" прежде. Существует различие в C++.

1
ответ дан 30 November 2019 в 16:14
поделиться

Вы не должны использовать указатели , если Вы уходите в отставку метода set и используете конструктора. Это - одна из важных функций в C++: основные инициализаторы в конструкторах часто позволяют избегать использования указателей.

class MyClass {

        public:

                MyClass(A & newInstance) : instance(newInstance) {
                }

                void doSomething() {
                        instance.action();
                }

        private:

                A & instance;
};



int main(int argc, char** argv) {
        B myInstance;
        MyClass c(myInstance);
1
ответ дан 30 November 2019 в 16:14
поделиться

Необходимо использовать указатель на как член MyClass.

class MyClass {

    public:

        void setInstance(A *newInstance) {
                instance = newInstance;
        }

        void doSomething() {
                instance->action();
        }

    private:

        A *instance;
};

, если Вы не делаете этого, конструктор MyClass попытается инстанцировать объекта (как он был бы для любого членского объекта), который не возможен, так как A абстрактен.

0
ответ дан 30 November 2019 в 16:14
поделиться

Когда Вы скажете

A instance;

, Вы создадите новый объект типа A. Но Вы уже сказали, что isa абстрактный класс, таким образом, Вы не можете к этому. Необходимо использовать указатель, как несколько других указали или делают некраткий обзор.

0
ответ дан 30 November 2019 в 16:14
поделиться

Dmitry корректен, необходимо использовать-lstdc ++, если Вы используете gcc, но еще лучше должны использовать g++ вместо этого. (Тот же синтаксис).
кроме того, Вы отметили бы (я предполагаю, добавляете ли Вы - Стена), что Вы получаете предупреждение, что Ваш класс с виртуальными функциями без деструктора, таким образом, хорошая идея состоит в том, чтобы добавить (виртуальный) деструктор к также.

0
ответ дан 30 November 2019 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: