微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决基础的定义必须先于派生合约的定义

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

Project2.sol 就像:

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

Project1.sol 就像:

import "./Project2.sol";

contract Project1 is Project2{

}

我已经在 Project2.sol 文件中部署了 Project1。而且我一直在使用来自 Project1.sol 文件的 Project2 中的结构。

我收到一个错误,即“基础的定义必须在派生合同的定义之前。”这一行:contract Project1 is Project2{

我在网上查了下错误,有两份合同一份文件解决方案。但是,我有两个文件

我将这两个合同合并到一个文件中。

这就是我所做的:

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);
        }
}

然后,我无法从 Project2 部署 Project1。当我这样做时,这是我得到的错误,“合同创建的循环引用(无法创建派生或相同合同的实例)在这部分address newProject1Address =address(new Project1());

我该怎么办?您有什么建议?

解决方法

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

当您从基础合同(项目 2)继承合同(项目 1)时,继承(项目 1)应该是进行调用的人。您的 (Project2) 合同就像一个基础合同。如果需要,继承合约(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;
        }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。