Как записать простой класс в C++?

Существует один поток пользовательского интерфейса, который должен использоваться для всех действий, взаимодействующих с вашими визуальными элементами WPF. Обычно у вас будет конструктор для MainWindow, который будет в этом потоке.

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

42
задан bstpierre 27 September 2012 в 12:46
поделиться

4 ответа

Хорошо документированный пример взят и лучше объяснен из Конструкторы и деструкторы в C ++ :

#include <iostream>            // for cout and cin

class Cat                      // begin declaration of the class
{
  public:                      // begin public section
    Cat(int initialAge);       // constructor
    Cat(const Cat& copy_from); //copy constructor
    Cat& operator=(const Cat& copy_from); //copy assignment
    ~Cat();                    // destructor

    int GetAge() const;        // accessor function
    void SetAge(int age);      // accessor function
    void Meow();
 private:                      // begin private section
    int itsAge;                // member variable
    char * string;
};

// constructor of Cat,
Cat::Cat(int initialAge)
{
  itsAge = initialAge;
  string = new char[10]();
}

//copy constructor for making a new copy of a Cat
Cat::Cat(const Cat& copy_from) {
   itsAge = copy_from.itsAge;
   string = new char[10]();
   std::copy(copy_from.string+0, copy_from.string+10, string);
}

//copy assignment for assigning a value from one Cat to another
Cat& Cat::operator=(const Cat& copy_from) {
   itsAge = copy_from.itsAge;
   std::copy(copy_from.string+0, copy_from.string+10, string);
}

// destructor, just an example
Cat::~Cat()
{
    delete[] string;
}

// GetAge, Public accessor function
// returns value of itsAge member
int Cat::GetAge() const
{
   return itsAge;
}

// Definition of SetAge, public
// accessor function
 void Cat::SetAge(int age)
{
   // set member variable its age to
   // value passed in by parameter age
   itsAge = age;
}

// definition of Meow method
// returns: void
// parameters: None
// action: Prints "meow" to screen
void Cat::Meow()
{
   cout << "Meow.\n";
}

// create a cat, set its age, have it
// meow, tell us its age, then meow again.
int main()
{
  int Age;
  cout<<"How old is Frisky? ";
  cin>>Age;
  Cat Frisky(Age);
  Frisky.Meow();
  cout << "Frisky is a cat who is " ;
  cout << Frisky.GetAge() << " years old.\n";
  Frisky.Meow();
  Age++;
  Frisky.SetAge(Age);
  cout << "Now Frisky is " ;
  cout << Frisky.GetAge() << " years old.\n";
  return 0;
}
32
ответ дан 26 November 2019 в 23:52
поделиться
class A
{
  public:
    // a simple constructor, anyone can see this
    A() {}
  protected:
    // a simple destructor. This class can only be deleted by objects that are derived from this class
    // probably also you will be unable to allocate an instance of this on the stack
    // the destructor is virtual, so this class is OK to be used as a base class
    virtual ~A() {}
  private:
    // a function that cannot be seen by anything outside this class
    void foo() {}
};
10
ответ дан 26 November 2019 в 23:52
поделиться
#include <iostream>
#include <string>

class Simple {
public:
  Simple(const std::string& name);
  void greet();
  ~Simple();
private:
  std::string name;
};

Simple::Simple(const std::string& name): name(name) {
  std::cout << "hello " << name << "!" << std::endl;
}

void Simple::greet() {
  std::cout << "hi there " << name << "!" << std::endl;
}

Simple::~Simple() {
  std::cout << "goodbye " << name << "!" << std::endl;
}

int main()
{
  Simple ton("Joe");
  ton.greet();
  return 0;
}

Глупо, но вот и все , Обратите внимание, что термин «видимость» является неправильным: общедоступный и частный контроль доступа, но даже «частные» элементы все еще «видимы» извне, просто недоступны (попытка получить к нему доступ - ошибка).

8
ответ дан 26 November 2019 в 23:52
поделиться

Даже если он студент, стоит попытаться ответить, потому что это сложный вопрос, по крайней мере, не так просто для нового посетителя C ++ :)

Классы в C ++ служат пересечением двух парадигм дизайна,

1) ADT :: что означает в основном новый тип, что-то вроде целых чисел int или вещественных чисел double или даже такое новое понятие, как «свидание». в этом случае простой класс должен выглядеть так,

class NewDataType
{
public:
// public area. visible to the 'user' of the new data type.
.
.
.
private:
// no one can see anything in this area except you.
.
.
.
};

это самый базовый скелет ADT ... конечно, это может быть проще, игнорируя общественные места! и стирание модификаторов доступа (публичный, частный), и все это будет приватным. но это полная чушь. Потому что NewDataType становится бесполезным! представьте себе "int", которое вы можете просто объявить, но НЕ МОЖЕТЕ с ним ничего делать.

Затем вам понадобятся некоторые полезные инструменты, которые в основном не требуются для существования NewDataType, но вы используете их, чтобы ваш тип выглядел как и любой «примитивный» тип в языке.

первый - это Конструктор. Конструктор нужен во многих местах языка. посмотрим на int и попробуем имитировать его поведение.

int x; // default constructor.

int y = 5; // copy constructor from a 'literal' or a 'constant value' in simple wrods.
int z = y; // copy constructor. from anther variable, with or without the sametype.
int n(z); // ALMOST EXACTLY THE SAME AS THE ABOVE ONE, it isredundant for 'primitive' types, but really needed for the NewDataType.

каждая строка в приведенных выше строках является объявлением, переменная создается там.

и, в конце концов, представьте указанные выше переменные int в функции, эта функция вызывается 'fun',

int fun()
{
    int y = 5;
    int z = y;
    int m(z);

    return (m + z + y)
    // the magical line.
}

вы видите волшебную строчку, здесь вы можете сказать компилятору все, что захотите! после того, как вы сделаете все, и ваш NewDataType больше не будет полезен для локальной области, как в функции, вы УБИВАЕТЕ ЕГО. классический пример - это освобождение памяти, зарезервированной для 'new'!

, так что наш очень простой NewDataType становится,

class NewDataType
{
public:
// public area. visible to the 'user' of the new data type.
    NewDataType()
    { 
        myValue = new int;
        *myValue = 0;
    }

    NewDataType(int newValue)
    {
        myValue = new int;
        *myValue = newValue;
    }

    NewDataType(const NewDataType& newValue){

        myValue = new int;
        *myValue = newValue.(*myValue);
    }
private:
// no one can see anything in this area except you.
    int* myValue;
};

Теперь это очень простой скелет, чтобы начать создание полезного класса, вам нужно предоставить общедоступные функции.

есть МНОГО крошечных инструментов, которые следует учитывать при построении класса на C ++,

. . . .

2) Object :: что означает в основном новый тип, но разница в том, что он принадлежит братьям, сестрам, предкам и потомкам. посмотрите на 'double' и 'int' в C ++, 'int' является солнцем 'double', потому что каждый 'int' является 'double', по крайней мере, в концепции :)

13
ответ дан 26 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

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