Как я могу сделать невозможным вызов функций моего класса в main?
Я пишу несколько классов для домашнего задания и хочу, чтобы функции члена моего класса не вызывались в main. Если они есть, я хочу, чтобы программа закрылась. Как я узнаю, когда выполняются мои функции-члены? Что касается класса, каждый объект представляет цвет в формате <100,200,215>. Спасибо за помощь!
class Color{
public:
Color( unsigned red = 0, unsigned green = 0, unsigned blue = 0 ); // ctor
unsigned getRed() const; // accessor
unsigned getGreen() const; // accessor
unsigned getBlue() const; // accessor
Color & setRed( unsigned red ); // mutator
Color & setGreen( unsigned green ); // mutator
Color & setBlue( unsigned blue ); // mutator
const Color & output() const;
private:
unsigned myRed;
unsigned myGreen;
unsigned myBlue;
static unsigned okColor(unsigned color);
}; //Class Color
int main(int argc, const char * argv[])
{
}
Color::Color( unsigned red, unsigned green, unsigned blue):
myRed(okColor(red)),myGreen(okColor(green)),myBlue(okColor(blue))
{
//initialization list here...
}
//accessors
unsigned Color::getRed() const {return myRed;}
unsigned Color::getGreen() const {return myGreen;}
unsigned Color::getBlue() const {return myBlue;}
//mutators
Color & Color::setRed(unsigned red){
myRed = okColor(red);
return *this;
}
Color & Color::setGreen(unsigned green){
myGreen = okColor(green);
return *this;
}
Color & Color::setBlue(unsigned blue){
myBlue = okColor(blue);
return *this;
}
//output
const Color & Color::output() const{
cout << "<" << myRed << "," << myGreen << "," << myBlue << ">" << endl;
return *this;
}
//checkers
unsigned Color::okColor(unsigned myColor){
if (myColor > 255) {
die("Color intensity is out of range!");
}
return myColor;
}
bool die(const string & msg){
cerr << endl << "Fatal error: " << msg <<endl;
exit(EXIT_FAILURE);
}
Color mixture( const Color & color0, const Color & color1, double weight){
double color1Multiplier = 0;
Color mixture;
unsigned mixtureRed;
unsigned mixtureBlue;
unsigned mixtureGreen;
color1Multiplier = 1 - weight;
mixtureRed = (color0.getRed() * weight) + (color1.getRed() * color1Multiplier);
mixtureBlue = (color0.getBlue() * weight) + (color1.getBlue() * color1Multiplier);
mixtureGreen = (color0.getGreen() * weight) + (color1.getGreen() * color1Multiplier);
mixture.setRed(mixtureRed);
mixture.setBlue(mixtureBlue);
mixture.setGreen(mixtureGreen);
return mixture;
}
2 ответа
Это просто, чтобы предотвратить вызов вашего класса из main. Не создавайте класс в main
- нет класса -> нет способа вызвать функции-члены (если они не являются статическими). Вы также можете переместить #include
заголовка класса в некоторый файл, который не находится в том же источнике, что и main
,
К сожалению, нет (тривиального и / или переносимого) способа определить, какая функция вызывает ваш код [особенно если учесть, что современные компиляторы довольно часто перемещают код, поэтому, хотя ваш код вызывает mixture
из основного, компилятор решает просто переместить это в main
потому что это делает его более быстрым, меньшим или любой другой целью, которую компилятор имеет с встроенными функциями].
Кроме того, нет способа остановить вызов функции из любой функции, которая имеет доступ к объекту. Почти для каждого аспекта функций, main
ничем не отличается от других функций. Единственная разница в том, что main
вызывается из библиотеки времени выполнения C++. Но компилятору на самом деле все равно, вызывается ли ваша функция main
, kerflunk
или же fred
,
Если вы создадите глобальный объект, он будет инициализирован раньше main
и уничтожен после main
выходы.
Вы можете использовать этот факт, чтобы установить флаг и вести себя так, как вы хотите.