将类函数与其他类定义分离

时间:2015-03-31 23:59:07

标签: c++

我有一个涉及多线程问题的学校作业。我不是在这里请求帮助解决具体问题,特别是因为我还没有到达那里。对于这个赋值,我必须定义一些从提供的Thread类继承的类。对于这个定义,我有一个主文件(thread.cpp),一个头文件(thread.h)和一个支持文件,其中包含由thread.cpp(thread-support.cpp)中定义的类调用的函数。 / p>

thread.h看起来像这样:

#ifndef _THREAD_H
#define _THREAD_H

#include <stdbool.h>
#include "ThreadClass.h"

Mutex potLock;
Mutex mamaLock;
Semaphore sleepyMama("SleepyMama", 0);
bool awake = false;

class Mama : public Thread {
    public:
        Mama();

    private:
        void ThreadFunc();
        void goto_sleep();
        void food_ready();
};

class Baby : public Thread {
    public:
        Baby(int id, Mutex* pots);

    private:
        void ThreadFunc();
        int id;
        Mama mama;
        Mutex *pots;
        void ready_to_eat();
        void finish_eating();
};

#endif

thread.cpp看起来像这样:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include "thread.h"
using namespace std;

Baby::Baby(int ID, Mutex feedPots[]) :
          id(ID), pots(feedPots)
{
    ThreadName.seekp(0, ios::beg);
    ThreadName << "Baby" << id << '\0';
}

void Baby::ThreadFunc() {
    Thread::ThreadFunc();
    mamaLock.Lock();
    if (!awake) {
        sleepyMama.Signal();
    }
    mamaLock.Unlock();
    Exit();
}

Mama::Mama()
{
    ThreadName.seekp(0, ios::beg);
    ThreadName << "Mama" << '\0';
}

void Mama::ThreadFunc() {
    char buf[200];
    Thread::ThreadFunc();
    sprintf(buf, "Mama started\n");
    write(1, buf, strlen(buf));

    goto_sleep();

    sprintf(buf, "Mama woke up!\n");
    write(1, buf, strlen(buf));
}

而thread-support.cpp目前看起来像这样:

#include <stdbool.h>
#include "thread.h"

void Mama::goto_sleep() {
    mamaLock.Lock();
    awake = false;
    mamaLock.Unlock();
    sleepyMama.Wait();
}

目前,我正在使用一个Makefile,它将每个.cpp文件编译成.o文件,使用带有标志-g和-02的g ++(因为这是我们的示例文件所具有的)以及其他标志使其工作与我们古老的自定义线程库。可执行文件使用命令c++ [custom library flags] -g -02 -o prog4 thread.o thread-support.o thread-main.o进行编译,其中thread-main.cpp是包含main.h函数的文件,其中包含thread.h。 thread.h中的Mutexes,Semaphore和bool需要可以被thread.cpp和thread-support.cpp访问,但如果我在两个文件中包含thread.h,我会遇到多个定义问题。我在thread-main中也遇到了多个定义问题。

2 个答案:

答案 0 :(得分:1)

Thread.cpp应该定义这些变量:

Mutex potLock;
Mutex mamaLock;
Semaphore sleepyMama("SleepyMama", 0);
bool awake = false;

虽然Thread.h应该只声明它们:

extern Mutex potLock;
extern Mutex mamaLock;
extern Semaphore sleepyMama;
extern bool awake;

您应始终(在大多数情况下)在.cpp文件中定义变量。标题应该只包含前向声明,以使某些符号对其他模块可见。

修改

要在thread-support.cpp中使用这些符号,您可以:

1) #include Thread.h

2)手动声明 - 在thread-support.cpp添加:

extern Mutex potLock;
extern Mutex mamaLock;
extern Semaphore sleepyMama;
extern bool awake;

答案 1 :(得分:-1)

那是因为你没有使用标题保护。

在头文件中或包含thread.h的任何地方

用这个

包裹它

ifndef INC_THREAD_H

定义INC_THREAD-H

//此处的所有代码

ENDIF

使用完整的头文件替换所有代码,然后在include语句的线程支持中使用它