错误:'class'没有命名类型C ++

时间:2013-04-29 10:31:14

标签: c++

我见过很多关于此事的帖子。但无论如何无法解决我的问题。

我的问题是我想从我的班级B发送一个爆炸到我的班级A.班级A已经宣布了B级(B b;)但是在B级不能做同样的事情(A a;)

看到如果A类包含B类,那么如果B类包含A类则不起作用。 “A不命名类型”

我将显示Metronome程序中的代码。

这是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!
}

那么如何在threadedobject.h中使用testApp.h中的bang()方法呢?

1 个答案:

答案 0 :(得分: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指向有效(完全构造的)对象。