Как я могу сделать невозможным вызов функций моего класса в 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 выходы.

Вы можете использовать этот факт, чтобы установить флаг и вести себя так, как вы хотите.

Другие вопросы по тегам