2013-04-29 116 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