Как мне объявить экземпляр класса в структуре? - PullRequest
0 голосов
/ 06 марта 2011
Class className{ ... 

struct vec
{   string name;
    className value;
};

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

Я пробовал много вещей: (например)

vecName.value = className hey;

но ничего .. это не должно быть очень сложно, но я чувствую, что борюсь ... кто-нибудь?спасибо

Ответы [ 2 ]

1 голос
/ 06 марта 2011

Ваш вопрос не очень правильно сформулирован, но вот что-то, что компилируется и работает, и вы, вероятно, можете извлечь из него необходимую информацию

#include <string>

class ClassName {
    // your code
};

struct vec
{
    std::string name;
    ClassName value;
};

int main() {
    vec v;
    ClassName yourclass;
    v.name = "hey";
    v.value = yourclass;
}

Однако, хотя это работает, есть несколько вещей, которыеэтот код можно считать «плохой практикой».

Прежде всего, вы, вероятно, должны сделать vec классом, а не структурой, и дать ему надлежащий конструктор, имя и значение.частный и т. д.

Итак, вот несколько лучший пример:

#include <string>

class ClassName {
    // your code
};

class Vec
{
public:
    Vec(const std::string &name, const ClassName &value)
    :   name_(name), value_(value) {}

    const std::string& getName() { return name_; }
    const ClassName& getValue() { return value_; }

    void setName(const std::string &name) { name_ = name; }
    void setValue(const ClassName &value) { value_ = value; }

private:
    std::string name_;
    ClassName value_;
};

int main() {
    ClassName yourclass1;
    Vec v("hey", yourclass1);
}

Это все еще не идеально, потому что:

  1. Каждый раз, когда вы копируете VecВы (все еще) также копируете свой класс.Это может быть хорошо, в зависимости от вашего приложения, но также может замедлить ваше приложение, если ваш класс очень большой.В этом случае вы можете сохранить указатель или умный указатель (например, boost :: shared_ptr ) для вашего класса.

  2. Я только что предоставил getX () иSetx ().Было бы лучше, если бы вы могли придумать функции, которые делают логические вещи, а не просто получают / устанавливают значение, как, например, в классе Dog могли бы выполняться run () и jump () и getHappiness ()

Однако эти вещи зависят от того, что вы пытаетесь сделать, поэтому вам придется делать это самостоятельно.

0 голосов
/ 06 марта 2011

Вы хотите установить для className значение vecName.value?

className instance;

vecName.value = instance;

Или если вы хотите установить vecName.value для нового экземпляра className:

vecName.value = className();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...