在预编译的头文件中配置循环依赖项

时间:2019-05-25 21:18:44

标签: c++ header-files circular-dependency precompiled-headers

我在循环依赖的社交网络模拟分配中遇到问题。我是预编译头文件的新手,但我想尝试一下。 到目前为止,我的代码正在运行,但是我迷迷糊糊了。 IDE VS。

我已经声明了要在另一个类中调用的类的功能' 功能,但不幸的是我遇到了

identifier "function_name" is undefined

我猜这是由于预编译头中头的顺序所致。哪个btw仅适用于非常令人不安的特定序列。

我已经尝试过重新排列头文件,这是一种没有预编译头文件的新解决方案,但到目前为止没有任何解决办法。

我的pch.h

#ifndef PCH_H
#define PCH_H
class User;
class Network;
class Message;
class Wall;
class FriendRequest;
class ReplyMessage;
class Menu;
class Exceptions;

#include "FriendRequest.h"
#include "Message.h"
#include "Wall.h"
#include "User.h"
#include "Network.h"
#include "ReplyMessage.h"

enum fr_status {
    accepted = 0, rejected = 1, pending = 2
};

#endif //PCH_H

还有我要引用的类。

Wall.h

#pragma once
class Wall
{
private:
    std::list<Message> msgs_posted;
    User* w_owner;
public:
    Wall() = delete;
    Wall(User* wownr);
    virtual ~Wall();

    void postMsg(User& usr ,Message msg);

    void toString();

    std::list<Message> getMsgsPosted();

};

Wall.cpp

#include "pch.h"
#include <iostream>

Wall::Wall(User * wownr)
    :w_owner(wownr)
{
}

Wall::~Wall()
{
}

void Wall::postMsg(User& usr, Message msg)
{
    //if are friends 
    if ((usr == *this->w_owner) || areFriends(usr,*this->w_owner)){
        msgs_posted.push_back(msg);
        /* does it get copied altogether? */
    }
    else 
        std::cout << "You can not post at this person's wall." << std::endl;
}

void Wall::toString()
{
    std::list<Message> ::iterator tmp_it;
    for (tmp_it = msgs_posted.begin(); tmp_it!= msgs_posted.end(); tmp_it++) {
        tmp_it->toString();
    }
    std::cout << std::endl;
}

std::list<Message> Wall::getMsgsPosted()
{
    return msgs_posted;
}

Network.h

#pragma once
class Network
{
private:
    /* Singleton Implementation */
    static Network* instance;
    Network();

    /* Misc */
    std::list<User> users;
    std::list<User>::iterator usr_it;
    std::map<User, std::list<User*> > connections; // maybe pointer to users list? 
    std::map<User, std::list<User*> >::iterator map_it;

public:
    /* Singleton Implementation */
    Network(const Network&) = delete;
    Network& operator=(const Network&) = delete;
    ~Network();
    static Network& getInstance();

    /* Other methods */
    bool u_Exists(User& usr);
    void addUser();
    void addUser(User& usr);
    void deleteUser(User& usr);
    void connectUsers(User& usr1, User& usr2);

    std::list<User> hasFriends(User& usr);
    bool areFriends(User& usr1, User& usr2);
    std::list<User> commonFriends(User* usr1, User* usr2);

};

Network.cpp

#include "pch.h"
#include <iostream>
Network::Network()
{}

...

Network& Network::getInstance()
{
    static Network instance;
    return instance;
}

bool Network::areFriends(User & usr1, User & usr2)
{
    if (usr1 == usr2) {
        return false;
    }
    else /*to be added*/{
        return false;
    }
}

我指的功能是bool Network::areFriends(User & usr1, User & usr2),用于

void Wall::postMsg(User& usr, Message msg)
{
    //if are friends 
    if ((usr == *this->w_owner) || areFriends(usr,*this->w_owner)){

如果需要的话,我将发布其余的课程,但不是因为人数过多。 我想找到一种以所需顺序进行声明的方法。

1 个答案:

答案 0 :(得分:0)

所以不应该是这样的

if ((usr == *this->w_owner) || Network::getInstance().areFriends(usr,*this->w_owner)){

在您发布的代码中,没有Network实例可以调用areFriends函数。