2013-04-11 2 views
1

숙제를 위해 몇 가지 클래스를 작성 중이며 클래스 멤버 함수를 main에서 호출 할 수 없도록하고 싶습니다. 그럴 경우 프로그램을 종료하고 싶습니다. 멤버 함수가 호출되는 시점을 어떻게 알 수 있습니까? 클래스의 경우 각 객체는 < 100,200,215> 형식의 색상을 나타냅니다. 도와 주셔서 감사합니다!클래스 멤버 함수를 main에서 호출 할 수 없도록하려면 어떻게해야합니까?

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; 
} 
+0

하지만 다른 기능에서 호출 할 수 있기를 원하십니까? –

+0

예. 나는 단지 그들이 main에서 호출 될 수 없기를 바란다. – user1681673

+0

한 가지 방법은 그것들을 비공개로 만들고'friend's에 접근하고자하는 곳에서 함수를 만드는 것입니다. –

답변

2

클래스가 메인에서 호출되는 것을 방지하는 것은 간단합니다. main에 클래스를 만들지 말아라 - 클래스가 없다 - 정적이 아닌 한 멤버 함수를 호출 할 방법이 없다. 클래스 헤더의 #includemain과 같은 소스에있는 파일로 이동할 수도 있습니다.

불행히도 코드를 호출하는 함수를 결정하는 방법은 없습니다. 특히 현대 컴파일러가 코드를 자주 이동한다는 사실을 염두에두면 코드가 mixture을 main에서 호출하지만, 컴파일러는 이것을 main으로 옮기기로 결정합니다. 왜냐하면 그것이 컴파일러가 인라인 함수로 가지고있는 다른 목표보다 더 빨리, 더 작게 또는 무엇이든 만들 수 있기 때문입니다.]

다른 점은 객체에 액세스 할 수있는 함수에서 함수가 호출되지 않도록 할 수 없다는 것입니다. 기능의 거의 모든면에서 main은 다른 기능과 다를 바 없습니다. 유일한 차이점은 main이 C++ 런타임 라이브러리에서 호출된다는 것입니다. 그러나 컴파일러는 함수가 main, kerflunk 또는 fred이라면 실제로 신경 쓰지 않습니다.

+2

나는'foo'와'bar'를 더 이상 사용하지 않을 것입니다. 이제부터는'kerflunk'와'fred'가 될 것입니다! ;) –

+1

그는'main'에서 함수 호출을 막으려 고하지 않고 있습니다. 다른 행동을 원한다면 즉시 종료하십시오. –

+0

@BenVoigt : 나는 이것이 가능하지 않다고 분명하게 대답했다고 생각한다. –

0

전역 개체를 만들면 main 전에 초기화되고 main 종료 후에 소멸됩니다.

이 사실을 사용하여 플래그를 설정하고 원하는대로 동작 할 수 있습니다.

+1

글쎄요, 나는 OP가'main'이 호출 된 후에 객체가 사용 가능해 지길 원한다고 가정합니다.'main' 내부에는 directlky가 아닙니다. –