C ++: функция внутри класса для нескольких значений переменных - PullRequest
3 голосов
/ 31 июля 2011

немного проблем с нубами.Внутри класса с именем 'cell' у меня есть enum 'Example' скажем

  typedef enum Example
  {
      E1=0,
      E2,
      E3,
      E4
  };
  Example inputValueE;

Также у меня есть функция внутри класса следующим образом

  void evolveE(Example type_);

За пределами класса я пытаюсьопределим функцию для нескольких типов следующим образом:

void cell::evolveE(Example type_ = E1){****some stuff****;};
void cell::evolveE(Example type_ = E2){****some diff stuff****;}; ***etc***

Я немного поиграл с этим, но безуспешно.Проблема в том, что мне не разрешено переопределять ту же функцию.Я собирался использовать команду типа switch-case, которая всегда резервная, хотя я почти уверен, что есть более элегантный способ сделать это

Любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 31 июля 2011

Для этого утверждения:

void cell::evolveE(Example type_ = E1);

Два очка:

  1. Здесь вы устанавливаете значение по умолчанию для параметра evolveE и не заставить его принять тип enum
  2. Вы не можете перегружать функции на основе значений любого вида; функция могут быть перегружены только разными типами и количеством параметров

Одно из решений:

Вы можете использовать сделать каждое значение независимым типом:

enum E1 {};
enum E2 {};
enum E3 {};
1 голос
/ 31 июля 2011

Этот синтаксис устанавливает аргумент по умолчанию. Он не соответствует фактическому параметру, переданному вызывающей стороной. Используйте switch / case.

Если вы хотите проявить фантазию, вы также можете использовать массив (или карту) указателей на функции.

0 голосов
/ 31 июля 2011

При перегрузке функции (предоставляя более одной функции с одним и тем же именем в классе), вам нужно предоставить различный набор аргументов типов для каждой функции, например:

void cell::evolveE(Example type_){****some stuff****;}
void cell::evolveE(OtherExample size_){****some diff stuff****;}

Обратите внимание, что здесь одна функция принимает аргумент типа Example, а другая - аргумент типа OtherExample.Хотя вы предоставляете разные значения по умолчанию в функции, которую вы пытаетесь перегрузить, обе функции принимают один и тот же аргумент type , поэтому компилятор не может определить разницу между ними.

Вы можетеиспользуйте переключатель, хотя я бы предпочел if / else, потому что он менее подвержен ошибкам.

Если перечисление Example действительно определяет тип вашего класса, вы можете использовать полиморфизм.Это очень элегантная особенность ООП.Тогда вы можете получить что-то вроде этого:

class cell
{
    ...
    virtual void evolveE() = 0;
};

class E1cell : public cell
{
    ...
    void evolveE()
    {
        // some stuff
    }
};

class E2cell : public cell
{
    ...
    void evolveE()
    {
        // some diff stuff
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...