PDA

Показать полную графическую версию : [решено] Непонятный вызов класса в C++


assch
29-03-2014, 19:30
Когда изучал классы в C++ на уроках было показано два примера
как можно пользоватся классами в коде
Например на основе трёх файлов:

main.cpp


#include <iostream>
#include <string>
using namespace std;
#include "SharedConfig.h"
#include "SharedConfig.cpp"

int main()
{
// Первый способ с последующим вызовом через "."
CSharedConfig class1;

cout << "Service ";
cout << class1.GetAppVersion() <<endl;
cout << endl;

// Второй способ с последующим вызовом через "->"
CSharedConfig *class2 = new CSharedConfig;

cout << "Service ";
cout << class2->GetAppVersion() <<endl;
cout << endl;
delete class2;

system("pause");
return 0;
}


SharedConfig.h


#pragma once

class CSharedConfig
{
public:
string GetAppVersion();
};


SharedConfig.cpp


#include "SharedConfig.h"

string CSharedConfig::GetAppVersion()
{
return "0.1.5";
}


Всё работает исправно
А сейчас разбираю один код и мне попался непонятный метод вызова
функции через класс


#include <iostream>
#include <string>
using namespace std;
#include "SharedConfig.h"
#include "SharedConfig.cpp"

int main()
{
// Третий способ ???
cout << "Service ";
cout << CSharedConfig::Shared()->GetAppVersion() <<endl;
cout << endl;

system("pause");
return 0;
}


Как понять этот способ

Что для этого нужно прописать в файле - SharedConfig.h
то есть как нужно оформить написание класса

И что нужно прописать в файле - SharedConfig.cpp
то есть что нужно вписать помимо функции (функция та что и выше)

Попробую прикрепить функции разбираемого кода

assch
29-03-2014, 22:58
На одном форуме подсказали одно решение для этой надстройки

CSharedConfig::Shared()->GetAppVersion()

Правда оно не совсем то что в разбираемых мною файлах
Но главное что работает


#include <iostream>
#include <string>
using namespace std;

class CSharedConfig
{
public:
static CSharedConfig* Shared()
{
return new CSharedConfig;
}

string GetAppVersion();
};

string CSharedConfig::GetAppVersion()
{
return "0.1.5";
}

int main()
{
cout << "Service ";
cout << CSharedConfig::Shared()->GetAppVersion() <<endl;
cout << endl;
system("pause");
return 0;
}


И ещё один способ подсказали объявление функции через класс

CSharedConfig::GetAppVersion()


#include <iostream>
#include <string>
using namespace std;

class CSharedConfig
{
public:
static string GetAppVersion();
};

string CSharedConfig::GetAppVersion()
{
return "0.1.5";
}

int main()
{
cout << "Service ";
cout << CSharedConfig::GetAppVersion() <<endl;
cout << endl;
system("pause");
}

deviance
30-03-2014, 00:38
Попробую ответить на вопрос "Как понять этот способ?".
Класс CSharedConfig реализует один из шалонов проектирования ООП - он называется Одиночка (http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D0%B3%D0%BB%D1%82%D0%BE%D0%BD_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%8 0%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29).
Метод CSharedConfig::Shared() предоставляет доступ к экземпляру класса и гарантирует, что экземпляр будет только один.

CSharedConfig* CSharedConfig::Shared()
{
if (m_Instance == 0)
m_Instance = new CSharedConfig();
return m_Instance;
}

Вы внесли ошибку своим изменением:

static CSharedConfig* Shared()
{
return new CSharedConfig;
}

Память будет "утекать" с каждым вызовом метода CSharedConfig::Shared(). Имейте в виду.




© OSzone.net 2001-2012