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

2023-11-21

我有两个不同的文件,即 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)应该是进行调用的合约。您的(项目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;
        }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基础的定义必须先于派生合约的定义 的相关文章

  • python 类工厂继承随机父类

    我有一些这样的代码 class Person object def drive self f t raise NotImplementedError class John Person def drive self f t print Jo
  • 实体框架 - 选择特定列并返回强类型而不丢失强制类型转换

    我正在尝试做类似的事情这个帖子 https stackoverflow com questions 1094931 linq to sql how to select specific columns and return strongly
  • 无法从 List 转换为 List

    我有这样的设置 abstract class Foo class Bar Foo 以及其他地方的这种形式的方法 void AddEntries List
  • 抽象 PHP 类中的返回类型“self”

    尝试创建一个抽象类来部分实现其子类的功能并强制执行此实现所需的契约 我使用以下构造 abstract class Parent public static function fromDB string name instance new s
  • 以太坊 Remix:所需 Gas 超出限额(30000000)问题

    我正在尝试在 BSC 测试网上部署智能合约 但 Remix IDE 向我抛出以下错误 我的 Metamask BinanceSmartChain 测试网钱包中有超过 3 个 BMB 创建 ContractName 时出错 内部 JSON R
  • 在 PHP 中扩展单例

    我正在使用一个 Web 应用程序框架 其中一部分由许多服务组成 所有服务均以单例形式实现 它们都扩展了一个 Service 类 其中实现了单例行为 如下所示 class Service protected static instance p
  • 行高继承

    我无法更改在正文中定义的跨度元素行高 我尝试使用 important 以及不同的行高表示法 包括字体 行高 这是代码 body font 16px 1 5 Arial Helvetica sans serif pageBody oferta
  • Java - 强制执行已实现的方法

    我有三门课 但我有问题 它们被命名为 GameScene StageScene StageOne 我的问题是我想在 StageScene 中实现初始化 但仍然强制 StageOne 实现它 这样每当有人使用 StageOne 对象 stag
  • 如何检查一个对象是否“完全”是一个类,而不是派生类?

    有任何方法可以确定一个对象是否是exactly一个类而不是它的派生类 例如 class A X class B A 我可以做这样的事情 bool isExactlyA X obj return obj is A obj is B 当然如果有
  • 友谊和派生类

    假设我有以下类层次结构 class Base protected virtual void foo 0 friend class Other class Derived public Base protected void foo Some
  • super 在多重继承中无用? [复制]

    这个问题在这里已经有答案了 在多重继承中 super 如何工作 例如这里我有两个init我想通过 super 发送参数 class LivingThings object def init self age name self name n
  • 如何从继承的方法中获取派生类的路径?

    如何从继承的方法中获取当前类的路径 我有以下内容 and
  • Java中对象类的继承

    当我读java书时 我遇到了 每个类都扩展类 Object 但是如果想要 B 类扩展 A 类 但是 B 类现在将具有多重继承 一个来自 Object 类 一个来自 A 类 如何解决冲突 谁能解释一下吗 它是多级继承 而不是多重 class
  • 仅检索子类的属性[重复]

    这个问题在这里已经有答案了 我有一个像这样的课程 class parent public foo class child extends parent public lol public function getFields return
  • 使用 hibernate 的多态“get”,多对一,InheritanceType.JOINED

    我有这样的东西 具有多个座位中的一个座位的汽车类别 Seat 有一个子类 LeatherSeat public class Car private Seat seat ManyToOne fetch FetchType LAZY publi
  • C# 中的类和基类继承

    我有一个 C 类 如下所示 public class BarChart public BarData BarChartData public BarStyle BarChartStyle public BarChart BarData da
  • CSS 继承、别名和其他很酷的东西

    有一天 我随机浏览网页 发现了一些程序 可以让你编写 CSS 别名和其他很酷的东西 我现在不记得了 举个例子 我记得你可以这样做 myclass background color red greenfont 其中 greenfont 在其他
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C# 中隐式/显式转换方法是否继承?

    我不确定我在这里做错了什么 我有一个通用类 它基本上是一个美化的整数 具有一些用于某些字符串格式设置的方法 以及字符串和 int 之间的转换 public class Base protected int m value From int
  • 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

    好吧 这可能不太可能 但还是这样吧 在Java JRE 1 6 0 26 b03 中我有两个类 SuperControl及其子类SubControl 它们都需要是持久对象 我正在使用 Hibernate Annotations 来实现这一点

随机推荐