Inheritance 基础的定义必须先于派生合同的定义

Inheritance 基础的定义必须先于派生合同的定义,inheritance,ethereum,solidity,smartcontracts,contract,Inheritance,Ethereum,Solidity,Smartcontracts,Contract,我有两个不同的文件,分别是Project1.sol和Project2.sol Project2.sol类似于: import "./Project1.sol"; contract Project2{ address newProject1Address =address(new Project1()); } import "./Project2.sol"; contract Project1 is Project2{ }

我有两个不同的文件,分别是Project1.sol和Project2.sol

Project2.sol类似于:

import "./Project1.sol";
        
contract Project2{
    address newProject1Address =address(new Project1());
}
import "./Project2.sol";

contract Project1 is Project2{

}
Project1.sol类似于:

import "./Project1.sol";
        
contract Project2{
    address newProject1Address =address(new Project1());
}
import "./Project2.sol";

contract Project1 is Project2{

}
我已经在Project2.sol文件中部署了Project1。我还使用了Project1.sol文件中Project2中的一个结构

我得到一个错误,即“基的定义必须在派生合同的定义之前。”对于此行:
合同项目1是项目2{

在我在互联网上检查错误后,有两个合同和一个文件的解决方案。但是,我有两个文件

我把这两份合同合并成一个文件

这就是我所做的:

pragma solidity >=0.7.0 <0.9.0;

contract Project2{

        Apple[] public applepies;
        
        struct Apple{
             string name;
             mapping (address => bool) applepie;
        }

        function createProject() external{
            
             address newProject1Address =address(new Project1(msg.sender));

             uint idx = applepies.length;
             applepies.push();
             Apple storage newProject = applepies[idx];
        }

        

    }


contract Project1 is Project2{
        address public creator;

        constructor (address creator1){
            
             creator= creator1;
        }

        function getDetails(uint index) public{
             Apple storage newv= applepies[index];
             //require(newv.applepie = msg.sender);
        }
}
pragma solidity>=0.7.0 bool)applepie;
}
函数createProject()外部{
地址newProject1Address=地址(newproject1(msg.sender));
uint idx=applepies.length;
applepies.push();
Apple storage newProject=applepies[idx];
}
}
合同项目1是项目2{
向公众发表演说;
构造函数(地址创建者1){
创建者=创建者1;
}
函数getDetails(uint索引)public{
苹果存储newv=applepies[index];
//require(newv.applepie=msg.sender);
}
}
然后,我无法从Project2部署Project1。当我这样做时,这就是我得到的错误,“合同创建的循环引用(无法创建派生或相同合同的实例)”在这部分
地址newProject1Address=address(newproject1())


我该怎么办?您的建议是什么?

您正在被调用方的另一个合同中实例化一个合同。有点像循环引用

当您从基本合同(项目2)继承合同(项目1)时,继承合同(项目1)应该是进行调用的合同。您的(项目2)合同的行为类似于基本合同。如果需要,继承协定(Project1)可以调用或覆盖基本协定中的所有函数。所以这里是我的建议(这是解决你问题的众多方法之一)。见下文。我编译并部署了它,它运行正常。部署时不要忘记提供地址。我希望这会有所帮助。如果你还有其他问题,请联系我

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
pragma experimental ABIEncoderV2;

contract Project2{

       
        
        struct Apple{
             string name;
             bool applepie;
             //mapping (address => bool) applepie;
        }
        
        Apple[] public applepies;
        Apple public newProject;
        
        constructor() {
            
             //address newProject1Address = address(new Project1(msg.sender));

             //uint idx = applepies.length;
             newProject = Apple("superApple", true);
             applepies.push(newProject);
        }

         function getNewProject() public view returns(string memory){
             return newProject.name;
        }

    }


contract Project1 is Project2{
        address public creator;

        constructor (address creator1){
            
             creator= creator1;
        }

        function getDetails(uint index) public view returns (string memory){
             Apple storage newv= applepies[index];
             //require(newv.applepie = msg.sender);
             return newv.name;
        }
}
//SPDX许可证标识符:GPL-3.0
pragma-solidity>=0.7.0 bool)applepie;
}
苹果[]公共苹果;
苹果公共工程;
构造函数(){
//地址newProject1Address=地址(newproject1(msg.sender));
//uint idx=applepies.length;
新项目=苹果(“超级苹果”,真);
applepies.push(新项目);
}
函数getNewProject()公共视图返回(字符串内存){
返回newProject.name;
}
}
合同项目1是项目2{
向公众发表演说;
构造函数(地址创建者1){
创建者=创建者1;
}
函数getDetails(uint索引)公共视图返回(字符串内存){
苹果存储newv=applepies[index];
//require(newv.applepie=msg.sender);
返回newv.name;
}
}

您能否澄清“我已在Project2.sol文件中部署了Project1”的含义。。。这没有多大意义:1)合同部署到网络,而不是文件。2) 错误消息和“Project2.sol中的Project1”表明您在一个文件中定义了两个契约,但您的代码示例明确定义了两个文件——“Project1.sol”和“Project2.sol”。@PetrHejda 1)我修复了我在帖子2)中试图说的部分,并添加了您所说的部分。你能再检查一下吗?我希望现在更清楚。对不起,我的英语太差了。还有几件事:1)你用的是什么版本的Solidity?2)
函数createProject{
抛出语法错误。它在一些非常旧的版本中有效,或者您没有正确复制粘贴括号(旧的实体版本)和可见性修饰符(
public
external
,…)。您是否也可以更正此错误?