2013-04-29 111 views
1

我見過這個問題的很多帖子。無論如何無法解決我的問題。錯誤:'類'不命名類型C++

我的問題是,我想從我的B類發一聲我的A類A級已經有了B類聲明(B B),但不能做B級相同(A一)

可以看出,如果A類包括B類,那麼如果B類包括A類,則不起作用。 「A不命名類型」

我將顯示我的節拍器程序中的代碼。

這是testApp.h

#ifndef TESTAPP_H_ 
#define TESTAPP_H_ 
#pragma once 

#include "ofMain.h" 
#include "ofxSimpleGuiToo.h" 
#include "ofxSynth.h" 
#include "threadedObject.h" 

class testApp : public ofBaseApp{ 

public: 
// virtual string getName() { return "testApp"; } 
    testApp(){ 

    } 
    ofxSynth synth; 

    threadedObject TO; 

    void setup(); 
    void update(); 
    void draw(); 
    int count; 
    int rate; 
    int last_time; 
    void audioOut(float *input, int bufferSize, int nChannels); 

    ofSoundStream soundstream; 
    //testApp(); 
    friend void bang(); 
    void keyPressed (int key); 
    void keyReleased(int key); 
    void mouseMoved(int x, int y); 
    void mouseDragged(int x, int y, int button); 
    void mousePressed(int x, int y, int button); 
    void mouseReleased(int x, int y, int button); 
    void windowResized(int w, int h); 
    void dragEvent(ofDragInfo dragInfo); 
    void gotMessage(ofMessage msg); 
    ofEventArgs eventA; 


    int mainAppsCount; 

    void bang(){ 
     synth.trigger(); 
    } 
private: 
    int bpm; 
    int current_bpm; 

    float current_frequency; 
    float frequency; 
    float volume; 



}; 
#endif 

#ifndef THREADED_OBJECT_H 
#define THREADED_OBJECT_H 
#pragma once 
#include "ofMain.h" 
#include "testApp.h" 

這裏是threadedObject類!在這裏,我只是想送一「砰」地testApp

class threadedObject : public ofThread { 
public: 
    testApp ta; #HERE IS THE FAIL 

    ofRectangle posRect; 
    int count; 
    int count2; 
    friend void bang(); 
    double bpmToSeconds; 
    double changedBpm; 
    double sum; 
    int counter; 
    int check; 
    //-------------------------- 
    threadedObject(){ 
     // testApp hej; 
     count = 1; 
     count2=0; 
     bpmToSeconds=60; 
     changedBpm=135; 
     sum = bpmToSeconds/changedBpm; 
     counter=0; 

    } 
    //-------------------------- 
    void start(){ 
     startThread(true, false); 
    } 
    //-------------------------- 
    void stop(){ 
     stopThread(); 
    } 
    //-------------------------- 
    void threadedFunction(){ 

     while(isThreadRunning() != 0){ 
      if(lock()){ 
       count++; 
       if(count>4) count= 1; 
       unlock(); 
       counter++; 
       ofSleepMillis(getBpm() * 1000); 
      } 
     } 
    } 
    //-------------------------- 
    void bpm(double bpm) 
    { 
     changedBpm=bpm; 
     sum = bpmToSeconds/changedBpm; 
    } 
    //-------------------------- 
    double getBpm(){ 
     return sum; 
    } 
    //-------------------------- 
    void draw(){ 

     string str = "I am a slowly increasing thread. \nmy current count is: "; 
     string tick = " TICK!"; 
     string tock = " TOCK!"; 
     posRect.set(150, 150, 0, 0); 
     if(lock()){ 
      str += ofToString(count); 
      if(counter%4==0){ 
      str += tock; 
      }else { 
       str += tick; 
      #Here i want to send a bang to testApp like ta.bang(); 
      } 
      unlock(); 
     }else{ 
      str = "can't lock!\neither an error\nor the thread has stopped"; 
     } 
     ofDrawBitmapString(str, 350, 156); 
    } 
    int getTick() 
    { 
     return counter; 
    } 
}; 
#endif 

顯示的testApp.cpp藏漢

#include "testApp.h" 

static const int bufferSize = 512; 
static const int sampleRate = 44100; 
//-------------------------------------------------------------- 
void testApp::setup(){ 

volume = 0.5f; 
gui.addTitle("Master volume"); 
gui.addSlider("Volume", volume, 0.5f, 1.f); 
frequency = current_frequency = 0.1f; 
gui.addTitle("Base Frequency"); 
gui.addSlider("frequency", frequency, 20.f, 2000.f); 

bpm=current_bpm; 
bpm=135; 
gui.addTitle("Metronome"); 
gui.addSlider("Bpm", bpm, 40.f, 140.f); 
mainAppsCount = 0; 
TO.start(); 
gui.show(); 
synth.setSampleRate(sampleRate); 
soundstream.setup(this, 2, 0, sampleRate, bufferSize, 4); 
} 
//-------------------------------------------------------------- 
void testApp::update(){ 
if(current_frequency != frequency) 
{ 
    synth.setFrequency(frequency); 
    current_frequency = frequency; 
} 

synth.setVolume(volume); 

mainAppsCount++; 
TO.bpm(bpm); 
} 
//-------------------------------------------------------------- 
void testApp::draw(){ 
ofSetHexColor(0xffffff); 
TO.draw(); 

string str = "I am a the main opengl thread.\nmy current count is: "; 
str += ofToString(mainAppsCount); 
ofDrawBitmapString(str, 350, 256); 


ofSetHexColor(0xff0033); 

ofDrawBitmapString("press 's' to stop the thread and 'a' to start it", 250, 360); 
gui.draw(); 
} 

//-------------------------------------------------------------- 
void testApp::keyPressed(int key){ 
if (key == 'a'){ 
    TO.start(); 
} else if (key == 's'){ 
    TO.stop(); 
} 
} 


void testApp::audioOut(float * output, int bufferSize, int nChannels) 
{ 
synth.audioOut(output, bufferSize, nChannels, 0); 
} 
//-------------------------------------------------------------- 
void testApp::mousePressed(int x, int y, int button){ 
    bang(); #The bang is in testApp.h. for just triggering the synth to play! 
} 

那麼,怎樣才能用我的一聲()方法testApp.h在threadedobject.h ?

+5

閱讀[本](http://stackoverflow.com/questions/16205367/two-template-classes-being-composed-of-a-member-of-each-other)。 – 2013-04-29 10:36:20

+0

是的,我知道我應該使用指針/參考 在這種情況下testApp * ta; 但是我如何使用ta? TA->邦(); ta.bang(); 當我做ta->砰();我得到這個: 錯誤:在'((threadedObject *)this)成員'bang'的請求 - > threadedObject :: ta',它是非類類型'testApp *'| – Drole 2013-04-29 11:09:45

+0

您應該在'threadedObject'類的定義之前放置前面聲明'class testApp;'。使用'ta-> bang();'因爲'ta'現在是一個指針。再次注意我在另一個問題中的解釋。在那裏,在類「A」的定義之前,我已經向前聲明瞭'B',即'class B;'。 – 2013-04-29 11:24:14

回答

3

A.H:

class B; // forward decl 
class A { 
    B*b; 
public: 
    void bang(); 
    void send(); 
    /* ... */ 
}; 

B.h:

class A; // forward decl 
class B { 
    A*a; 
public: 
    void bang(); 
    void send(); 
    /* ... */ 
}; 

A.cc

#include A.h 
#include B.h 
void A::bang() { /* ... */ } 
void A::send() 
{ 
    b->bang(); 
} 

B.cc

#include B.h 
#include A.h 
void B::bang() { /* ... */ } 
void B::send() 
{ 
    a->bang(); 
} 

ö當然,你可能只需要一個頭文件和一個源文件。

編輯

當然,必須注意的是B::aA::b都指向有效的指針(完全構造)的對象。

+0

得到它的工作!有點!我有 void B :: send(){ a-> bang(); } 它觸發了A中的爆炸。但是,如果我在bang()中放置任何代碼,它就會崩潰。 void bang(){ cout <<「Hello」<< endl; // This Works counter ++; //不起作用(崩潰) synth.trigger(); // does not work(crash) } – Drole 2013-04-29 13:24:53

+0

@Drole你確定成員指針'a'和'b'指向的對象是有效的(完全構造的)嗎?如果不是,那麼'counter;'可能無法訪問。最好在一個問題中提供一個*簡單*的代碼。 – Walter 2013-05-01 12:10:44